在 dataProvider 中定义期望是一个好习惯吗
Is it a good practice to define expectation in dataProvider
dataProvider 的快速示例:
return [
['180d-1pc', '6m-1pc'],
]
并测试:
public function test_convert($title, $expected)
{
$uut = new Converter();
$this->assertEquals($expected, $uut->convertDayTitle($title));
}
(简单地说:测试我们是否将 180d(天)转换为 6m(月))
如您所见 - 在数据提供者中定义了输入数据以及预期的输出。
这在很多情况下都很好用,但我一直觉得这可能不是最好的主意。所以我想知道是否可以将其视为不良做法。如果是这样 - 什么时候我会发现这样做是个坏主意?
一个例子是,当您想在两个测试中使用同一个数据提供者时——您是否应该定义两个期望值并使用其中一个?
快速示例(我刚刚编造的,所以不要注意我只是根据标题制作产品 object ;)):
public function test_gets_discount_when_licence_period_longer_than_1year($title, $expectedTitle, $expectedDiscount) {
$prod = new Product($title);
$this->assertEquals($expectedDiscount, $product->hasDiscount();
}
如何让它更优雅?
你所做的完全没问题。数据提供者可以而且应该包括预期的测试结果。
关于重复使用同一个dataProvider进行2次测试,并且只使用部分字段的问题:我想说如果字段是相关的(即它们是同一个对象的属性),它是可以接受的。
如果您觉得 dataProvider 变得太大太复杂,因为 2 个测试必须使用它的数据,只需创建 2 个单独的 dataProvider,并使用另一个私有通用方法来构建通用数据。
dataProvider 的快速示例:
return [
['180d-1pc', '6m-1pc'],
]
并测试:
public function test_convert($title, $expected)
{
$uut = new Converter();
$this->assertEquals($expected, $uut->convertDayTitle($title));
}
(简单地说:测试我们是否将 180d(天)转换为 6m(月)) 如您所见 - 在数据提供者中定义了输入数据以及预期的输出。
这在很多情况下都很好用,但我一直觉得这可能不是最好的主意。所以我想知道是否可以将其视为不良做法。如果是这样 - 什么时候我会发现这样做是个坏主意?
一个例子是,当您想在两个测试中使用同一个数据提供者时——您是否应该定义两个期望值并使用其中一个?
快速示例(我刚刚编造的,所以不要注意我只是根据标题制作产品 object ;)):
public function test_gets_discount_when_licence_period_longer_than_1year($title, $expectedTitle, $expectedDiscount) {
$prod = new Product($title);
$this->assertEquals($expectedDiscount, $product->hasDiscount();
}
如何让它更优雅?
你所做的完全没问题。数据提供者可以而且应该包括预期的测试结果。
关于重复使用同一个dataProvider进行2次测试,并且只使用部分字段的问题:我想说如果字段是相关的(即它们是同一个对象的属性),它是可以接受的。
如果您觉得 dataProvider 变得太大太复杂,因为 2 个测试必须使用它的数据,只需创建 2 个单独的 dataProvider,并使用另一个私有通用方法来构建通用数据。