【问题标题】:How to determine which assertion failed in a loop?如何确定哪个断言在循环中失败?
【发布时间】:2016-11-03 02:42:18
【问题描述】:

我有一个 PHPUnit 测试循环遍历一组无效值,并断言每个值都被函数正确拒绝。

例如,validateInput 只有在输入为字符串时才应返回 true,否则返回 false。

public function testValidateInput()
{
  $obj = new MyClass();
  $data = [
    null,
    42,
    21.21,
    -24,
    -12.12,
    false,
    array('key' => 'value'),
    (object) 'value'
  ];

  foreach ($data as $item){
    $this->assertSame(false, $obj->validateInput($item));
  }
}

当测试未通过断言时,我只得到行号 - 这对于所有值都是相同的,因为它处于循环中。

1) MyClassTest::testValidateInput
Failed asserting that true is identical to false.

/home/jeff/MyClass/tests/MyClassTest.php:24

如何确定哪个值未通过断言?

【问题讨论】:

  • 如果我没记错的话,可以将最后一个参数作为自定义消息传递,对吗?然后您可以$this->assertSame(false, $obj->validateInput($item), 'Failed to test ' . $item); 以便您在屏幕上收到失败的值。

标签: php phpunit


【解决方案1】:

assertSame 有一个接受消息的重载;您可以传递消息中的索引和值:

foreach ($data as $index => $item) {
    $this->assertSame(false, $obj->validateInput($item), (string)$item); // include $index too 
}

【讨论】:

    【解决方案2】:

    使用data provider。然后 PHPUnit 会告诉你提供者的哪个索引失败了。

    /**
     * @dataProvider getInputData
     */
    public function testValidateInput($value)
    {
      $obj = new MyClass();
    
      $this->assertSame(false, $obj->validateInput($value));
    }
    
    public function getInputData()
    {
        return [
          [null],
          [42],
          [21.21],
          [-24],
          [-12.12],
          [true],
          [false],
          [array('key' => 'value')],
          [(object) 'value'],
      ];
    }
    

    1) Test::testValidateInput with data set #3 (21.21)
    Failed asserting that true matches expected false.
    

    还有一个提示:当断言布尔值时,使用assertFalse 方法

    【讨论】:

    • 太棒了,谢谢!你知道为什么当我运行测试时,而不是21.21,它增加了尽可能少的数量吗? ...with data set #3 (21.210000000000001)
    • 查看PHP manual on float type的警告框以及链接页面Why don’t my numbers add up。基本上,在二进制表示中,不可能精确地表示浮点数。
    • 不错,好东西。那么,您在此处发布的答案是您手动编辑它只说(21.21),还是在运行时它实际上以这种方式出现在您的机器上?
    • 不,我已经把代码和错误信息写在我的脑海中,只是作为一个例子,我并没有真正运行任何代码。
    【解决方案3】:

    PHPUnit 的断言方法最后都有一个附加参数,您可以使用它来进行描述。只需在描述字符串中包含循环迭代值,您就会确切知道哪个失败了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2013-06-17
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多