【问题标题】:PHPSpec: How to handle data heavy mocks in spec?PHPSpec:如何处理规范中的数据重模拟?
【发布时间】:2017-04-26 15:22:53
【问题描述】:

我有一系列规范正在做我希望它们做的事情,但我想知道我是否过于复杂了,因为其中一些的 let 函数相当大而且很麻烦。

我已经为一系列类构建了规范,这些类根据响应处理来自 SQL 或 JSON API 的响应。规范只是检查每个类的进程的结果对象。我已经模拟了连接,以便为规范将触发的每种类型的请求返回有效的模拟数据。我正在尝试一种更好的方法来提供这种模拟数据,而不是仅仅在规范文件中提供相当大的数组和 JSON 字符串。

例如(简体):

class CharacterProcessorSpec extends ObjectBehavior
{
  public function let(AdapterInterface $adapter)
  {
    $characters = [
      [
        'name' => 'Timmy',
        'class' => 'Fighter',
        'level' => 1,
        'race' => 'Elf',
        'str' => 16,
        'dex' => 14,
        'con' => 18,
        'int' => 10,
        'wis' => 12,
        'cha' => 11,
        ... // Rest of the minimally required fields
      ], [
        ... // Second character for processing multiple at once
      ]
    ];
    $adapter->fetch(new CharacterRequest('Timmy'))->willReturn([$characters[0]]);
    $adapter->fetch(new CharacterRequest('*'))->willReturn($characters);
    $this->beConstructedWith($adapter);
  }

  public function it_should_build_requested_character_details()
  {
    $this->build('Timmy')->shouldReturnArrayOfCharacters();
  }

  public function it_should_build_all_character_details()
  {
    $this->buildAll()->shouldReturnArrayOfCharacters();
  }

  public function getMatchers()
  {
    return [
      'returnArrayOfCharacters' => function($characters) {
        foreach ($characters as $c) {
          if (!$c instanceof Character) {
            return false;
          }
        }
        return true;
      }
    ];
  }
}

值得我将数组移动到一个单独的文件并加载它们还是不值得?

注意:构建函数被设计为不关心适配器是用于 SQL 还是 API,它只是将数据转换为一致的对象。因此,规范实际上并没有定义数据是什么(在示例中,我提供的数据与 SQL 响应相同,但我通常将第二个条目格式化为 JSON 响应在每个条目基础上处理时的格式)。

【问题讨论】:

  • 安排部分测试(独立于您正在使用的库)有时可能很麻烦。如果您需要数组中的所有这些字符作为“夹具”,恐怕这是您的测试的“最小设置”,因此您不能采取不同的行动。一种解决方案是将该数组减少到最小的“重要”数据集并移动。我不能 100% 确定这条评论是否正确,但根据我的经验,我总是这样。

标签: php-7 phpspec


【解决方案1】:

值得我将数组移动到一个单独的文件并加载它们还是不值得?

不,不值得这样努力。您只向构造函数提供数据,并且在直接定义中应该可以。

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多