Хотя принятое решение должно работать, я настоятельно рекомендую вам не проводить такого рода тесты. Каждый вызов метода приводит к некоторому выводу и некоторым побочным эффектам. Итак, если нет вывода и нет побочных эффектов, то метод просто ничего не делает. Утверждая, какой MethodB или MethodC был вызван, вы не проверяете выходные данные MethodA и их побочные эффекты. Такие тесты являются хрупкими, поскольку они тестируют только одну возможную реализацию метода A, а не то, что на самом деле делает . Под хрупким я подразумеваю следующее:
предположим, у вас есть следующая реализация IObject
class ObjectImpl
{
public void MethodA(ObjectA arg1)
{
if (arg1.Something)
{
MethodB(new ObjectB(arg1), new ObjectC(arg1));
}
else
{
MethodC(new ObjectD(arg1), new ObjectE(arg1));
}
}
public void MethodB(ObjectB arg1, ObjectC arg2)
{
Console.WriteLine("Hi {0} and {1}", arg1, arg2);
}
public void MethodC(ObjectD arg1, ObjectE arg2)
{
Console.WriteLine("Bye {0} and {1}", arg1, arg2);
}
}
Итак, по сути, MethodA просто выводит «Hi» или «Bye» на консоль. Тогда, если кто-то заметит, что MethodB и MethodC не будут использоваться нигде, кроме MethodA, он может просто удалить их. Обратите внимание, что MethodA все тот же, поэтому ничего не сломалось, кроме теста.
class ObjectImpl
{
// Everything works as before except broken build
public void MethodA(ObjectA arg1)
{
if (arg1.Something)
{
Console.WriteLine("Hi {0} and {1}", new ObjectB(arg1), new ObjectC(arg1));
}
else
{
Console.WriteLine("Bye {0} and {1}", new ObjectD(arg1), new ObjectE(arg1));
}
}
}