将自己的断言添加到phpUnit时组织参数的最佳方法

时间:2012-06-05 03:25:30

标签: php phpunit

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

  1. 预期结果
  2. 实际值
  3. 失败时打印的可选消息
  4. (有些,例如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);
    

    感觉更干净。但这种情况是否存在惯例?

1 个答案:

答案 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'); 

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