3

几乎所有的 phpUnit 断言都是三个参数:

  1. 预期结果
  2. 实际价值
  3. 失败时打印的可选消息

(有些,例如assertTrue(),有一个隐含的预期结果,所以只有两个参数。)

但是,如果预期结果不那么干净怎么办?它可能是可选参数,也可能只是需要测试的值不止一个。作为一个具体的例子,我有assertTimestamp($expected_time,$actual_time,$tolerance=0,$msg='')容忍允许一点时钟漂移的地方。(我还使用它来测试数据库中创建的时间戳,以断言该记录是在过去 30 秒内创建的,即由当前单元测试运行中的前一个函数创建的。)

这看起来合理吗?即总是推$msg到最后,并保持实际作为第二个参数。assertTag有一个isHTML标志,最后出现在 . 之后$msg

作为一个更复杂的例子,我有一个函数,它接受一个 json 字符串作为$actual参数。它运行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);

那感觉更干净。但是对于这种情况是否存在现有的约定?

4

1 回答 1

2

我通过 phpunit 代码库看到的模式是:

[$expected (if needed)], $actual, $message = '', [other optional paramters]

例如,看看Framework/Assert.php file

public static function assertEquals(
    $expected, 
    $actual, 
    $message = '', 
    $delta = 0, 
    $maxDepth = 10, 
    $canonicalize = FALSE, 
    $ignoreCase = FALSE
)

或者更准确地说,因为 $actual 可以由多个变量组成(例如类和属性):

[$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'); 

至少在每个使用它的地方都是“内联文档”。

于 2012-06-05T12:24:05.113 回答