几乎所有的phpUnit断言都是三个参数:
(有些,例如assertTrue()
,有一个隐含的预期结果,所以只有两个参数。)
但是,如果预期结果不那么干净怎么办?它可以是可选参数,或者可能只是测试比一个值更多。作为一个具体的例子,我有assertTimestamp($expected_time,$actual_time,$tolerance=0,$msg='')
,其中容差允许一点时钟漂移。 (我还用它来测试数据库中创建的时间戳,断言记录是在最后30秒内创建的,即当前单元测试运行中的前一个函数。)
这看起来合理吗?即始终将$msg
推到最后,并将实际作为第二个参数。 assertTag
isHTML
之后有一个$msg
标记,最后一个标记。
作为一个更复杂的例子,我有一个函数,它为$actual
参数提供了一个json字符串。它运行json_decode
,提取一些值,并检查每个值。我现在有这样的事情:
function assertJsonPersonFromDBResponse($name,$gender,$age,$actual,$expectSomething=false,$msg='')
你会以不同的方式做吗?我现在想知道将所有预期参数(包括可选标志)压缩到第一个参数中是否更好,这将是一个关联数组:
function assertJsonPersonFromDBResponse($expected,$actual,$msg='')
...
$this->assertJsonPersonFromDBResponse(array('name'=>'Darren','age'=>21,
'gender'=>'M','expectSomething'=>true),$s);
感觉更干净。但这种情况是否存在惯例?
答案 0 :(得分:2)
我在phpunit代码库中看到的模式是:
[$expected (if needed)], $actual, $message = '', [other optional paramters]
对于exaples,请查看Framework/Assert.php file
public static function assertEquals(
$expected,
$actual,
$message = '',
$delta = 0,
$maxDepth = 10,
$canonicalize = FALSE,
$ignoreCase = FALSE
)
或者更为精确,因为$ actual可以由多个变量组成(例如class&属性):
[$allExpectedParamsIfNeeded], $allActualParams, $message='', [$allOtherSwitches]
例如:
public static function assertAttributeInternalType(
$expected,
$attributeName,
$classOrObject,
$message = ''
)
或
public static function assertSelectRegExp(
$selector,
$pattern,
$count,
$actual,
$message = '',
$isHtml = TRUE
)
尽可能减少参数数量并使用更多断言函数:
$this->assertStuff($a, $b, true, false, 'Oh dear', 6, true);
对我来说是不可读和混淆的。
具有
$this->assertStuffForSpecificCaseWithSubcaseSix($a, $b, 'Oh dear');
至少在其使用的每个地方都是“内联文档”。