我有一个常数的类:
class LoremIpsum {
const VALUE = '123';
public function MethodThatUsesConstant() {
...
}
}
当我想对使用这个常量的方法进行单元测试时,我应该使用真实类中的常量,还是应该在Test Class中创建一个与实常数值相同的新常量?
例如:
class LoremIpsumTest {
const VALUE = '123';
public function testMethodThatUsesConstant() {
...
}
}
或
class LoremIpsumTest
{
//this test uses the real constant
public function testMethodThatUsesTheRealConstant() {
/**$const = \Namespace\LoremIpsum::VALUE **/
}
}
答案 0 :(得分:1)
这取决于这个常数代表什么。如果这是业务要求(例如“窗口小部件应该每页显示20行”和const ROWS_PER_PAGE = 20
),则不应在测试中重复使用此常量。更改代码不应更改业务要求(应由测试表示)。创建这样的依赖可能会使整个测试完全没有意义 - 我可以将ROWS_PER_PAGE
更改为10
并且测试将通过,如果需求清楚,每页应该有20行,则会发生事件。
是的,它看起来并不干净,但这是测试的全部要点 - 你要创建两个不同的相同要求的表示:每页渲染20行的代码和检查有20行的测试每页。通过设计测试重复代码,您不必过于担心重复的常量。
答案 1 :(得分:0)
我宁愿建议您遵循dry原则并仅使用原始常量,而且您将有单点真实。
答案 2 :(得分:0)
我会将实际常量用于我的测试,但这取决于你使用常量的是什么。您的示例没有为您的特定用例提供足够的上下文。
如果您使用常量的值作为返回的ID,我将在测试中使用实常量。当我检查返回值时,实际值是什么并不重要,但这是常数。常量的存在是类的公共接口的一部分,并检查该值是否确保它实际存在。更改此值不会更改类的行为,因此测试应始终通过。
如果在计算中使用常量,我根本不用担心。在这种情况下,常量变为实现细节。在这种情况下,我会让我的测试实际计算出一组给定输入的值。让我的测试为我执行计算可能看起来很方便但是存在重复数学错误的风险,因为您可能会复制粘贴算法。所以在这些测试中,我根本不会使用任何常量。