【发布时间】:2019-06-27 20:12:51
【问题描述】:
所以我有这样的事情:
class MyClass {
private myVar;
public MyClass(someValue) {
// Performs some operation to determine myVar
}
public double calculateThing() {
// Returns some arithmetic operation on myVar
}
public double calculateOtherThing() {
newVar = calculateThing();
// Returns some arithmetic operation on newVar
}
}
calculateThingUnitTest() {
MyClass class = new MyClass(someValue);
Assert::AreEqual(someConstant, class.CalculateThing());
}
calculateOtherThingUnitTest() {
MyClass class = new MyClass(someValue);
Assert::AreEqual(someOtherConstant, class.CalculateOtherThing());
}
很明显calculateThingUnitTest 是一个合适的单元测试,因为它初始化一个类,在构造函数中给它一些字面定义的独立值,并且它所做的断言仅基于@ 987654323@,所以它测试应用程序的一个“单元”。
但是,calculateOtherThingUnitTest 调用calculateOtherThing,然后调用calculateThing 以确定结果是否正确。因此,如果 calculateThing 最终失败,calculateOtherThing 也会失败。
为了防止这种情况发生,您需要放置一些模拟值来代替calculateThing,您可以通过将新成员变量插入MyClass 并将calculateThing 加载到该成员变量中来实现此目的。然后在调用calculateOtherThing 之前,您可以在该成员变量中插入一个文字值,这样您就可以进行适当的单元测试了。
然而,添加一个新成员变量并将其公开给公众似乎非常过分。有没有更好的方法来实现这一点?
注意:虽然我使用的是伪代码,但我正在使用 C# 和 Visual Studio .Net 单元测试项目。
【问题讨论】:
-
嗯,这并不是一个真正的问题,更重要的是,这似乎是单元测试领域的“坏习惯”(我对此很陌生),所以我很好奇您将实施什么策略以使其成为“良好实践”。同样在我的具体情况下,将方法保持为非静态将有利于整体设计。我想我在问什么是实现单元测试的“正确”方法,假设该方法是非静态的。
-
隔离那个目标函数的困难应该是这个函数有太多职责的指标,这是违反(SRP - 单一职责原则)的,因为它与 SOLID 代码有关。
-
对糟糕的代码进行单元测试并不能改变代码设计糟糕的事实。然而,它应该有助于识别糟糕的代码,以便对其进行相应的重构。
-
阅读 SOLID 原则。你可能误解了我的解释。
标签: c# visual-studio unit-testing testing