如何确定循环中哪个断言失败?
How to determine which assertion failed in a loop?
我有一个 PHPUnit 测试,它循环遍历一组无效值,并断言每个值都被该函数正确拒绝。
例如,validateInput
仅当输入为字符串时才应 return 为真,否则 return 为假。
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 的断言方法在末尾都有一个附加参数,您可以使用该参数进行描述。只需在描述字符串中包含循环迭代值,您就可以准确知道是哪一个失败了。
assertSame
有一个接受消息的重载;您可以在消息中传递索引和值:
foreach ($data as $index => $item) {
$this->assertSame(false, $obj->validateInput($item), (string)$item); // include $index too
}
使用 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
方法
我有一个 PHPUnit 测试,它循环遍历一组无效值,并断言每个值都被该函数正确拒绝。
例如,validateInput
仅当输入为字符串时才应 return 为真,否则 return 为假。
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 的断言方法在末尾都有一个附加参数,您可以使用该参数进行描述。只需在描述字符串中包含循环迭代值,您就可以准确知道是哪一个失败了。
assertSame
有一个接受消息的重载;您可以在消息中传递索引和值:
foreach ($data as $index => $item) {
$this->assertSame(false, $obj->validateInput($item), (string)$item); // include $index too
}
使用 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
方法