在 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,并使用另一个私有通用方法来构建通用数据。