我对单元测试概念很陌生,我坚持写我的第一个。
我有一种标准化 ID 值的方法。它应该为任何正数返回传递的值(即使它是内部带有数字的字符串),对于任何其他传递的值都应该返回零 (0)。
function normalizeId($val) {
// if $val is good positive number return $val;
// else return 0;
}
我想为此函数编写一个单元测试并对任何可能的参数进行断言。例如:
5, -5, 0, "5", "-5", 3.14, "fff", new StdClass()
等。
我应该在我的 TestCase 类中为任何这种情况编写一个方法,还是在单独的行上使用一个所有条件的方法?IE
public function testNormalizeId() {
$this->assertEquals(5, MyClass::normalizeId(5));
$this->assertEquals(0, MyClass::normalizeId(-5));
$this->assertEquals(0, MyClass::normalizeId("fff"));
}
或者
public function testNormalizeId_IfPositiveInt_GetPositiveInt() {
$this->assertEquals(5, MyClass::normalizeId(5));
}
public function testNormalizeId_IfNegativeInt_GetZeroInt() {
$this->assertEquals(0, MyClass::normalizeId(-5));
}
public function testNormalizeId_IfNotIntAsString_GetZeroInt() {
$this->assertEquals(0, MyClass::normalizeId("fff"));
}
最佳实践如何?我听说第二个选择很好,但我担心很多可能的参数值有很多方法。可以是正数、负数、零、内含正数的字符串、内含负数的字符串、内含浮点数的字符串等。
编辑
或者也许是第三种方法provider
?
public function testNormalizeIdProvider()
{
return array(
array(5, 5),
array(-5, 0),
array(0, 0),
array(3.14, 0),
array(-3.14, 0),
array("5", 5),
array("-5", 0),
array("0", 0),
array("3.14", 0),
array("-3.14", 0),
array("fff", 0),
array("-fff", 0),
array(true, 0),
array(array(), 0),
array(new stdClass(), 0),
);
}
/**
* @dataProvider testNormalizeIdProvider
*/
public function testNormalizeId($provided, $expected)
{
$this->assertEquals($expected, MyObject::normalizeId($provided));
}