PHPSpec:如何在规范中处理数据重型模拟?

时间:2017-04-26 15:22:53

标签: php-7 phpspec

我有一系列的规格正在按照我的意愿行事,但我想知道我是否过于复杂,因为我的let函数对于其中一些来说相当大而且很麻烦。

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

例如(简化):

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响应在每个条目的基础上处理的方式)。 / p>

1 个答案:

答案 0 :(得分:0)

  

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

不,不值得这样做。您只向构造函数提供数据,在直接定义中它应该没问题。