私は単体テストの概念に非常に慣れていないため、最初の概念を書き続けています。
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 クラスにメソッドを記述する必要がありますか?それとも、すべての条件を別々の行に 1 つのメソッドで記述する必要がありますか? いえ
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"));
}
ベストプラクティスはどうですか?2 番目の選択肢が良いと聞きましたが、非常に多くの可能なパラメーター値に対して非常に多くのメソッドが存在することを心配しています。正の数、負の数、ゼロ、内部に正の数を含む文字列、内部に負の数を含む文字列、内部に浮動小数点数を含む文字列などを指定できます。
編集
または多分3番目のアプローチ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));
}