Так у меня что-то вроде так:
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
является правильным модульным тестом, потому что он инициализирует класс, присваивает ему определенное литеральное независимое значение в конструкторе, и утверждение, которое он делает, основано только на calculateThing()
, поэтому он тестирует один «модуль» приложения.
Однако, calculateOtherThingUnitTest
вызывает calculateOtherThing
, который затем вызывает calculateThing
, чтобы определить, верен ли результат. Таким образом, если calculateThing
завершится с ошибкой, calculateOtherThing
также будет с ошибкой.
Чтобы предотвратить это, вы бы хотели поместить некоторое фиктивное значение вместо calculateThing
, и вы могли бы достичь этого, вставив новую переменную-член в MyClass
и загрузив calculateThing
в эту переменную-член. Затем перед вызовом calculateOtherThing
вы можете просто вставить литеральное значение в эту переменную-член, и у вас будет подходящий модульный тест.
Однако добавление новой переменной-члена и ее публичное показание кажется чрезмерно излишним. Есть ли лучший способ добиться этого?
Примечание. Хотя я использую псевдокод, я работаю в C # с проектом модульного тестирования Visual Studio .Net.