【发布时间】: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% 确定这条评论是否正确,但根据我的经验,我总是这样。