如何确定循环中哪种断言失败



我有一个phpunit测试,该测试通过无效的值循环,并断言每个函数正确拒绝了每个值。

例如,validateInput仅在输入为字符串时才返回true,else返回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

如何确定哪个值失败了主张?

使用数据提供商。然后,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方法

phpunit的断言方法在末尾都有一个附加参数,您可以将其用于描述。只需在描述字符串中包含循环迭代值,您就会确切知道哪一个失败。

assertSame具有接受消息的过载;您可以通过索引和消息中的值传递:

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

相关内容

最新更新