Теперь я в основном хотят, чтобы проверить это публичный метод (...)
Это здорово. Это то, что вы должны делать. Забудьте о внутренних деталях на мгновение. С точки зрения общественного метода, есть ли разница между этими двумя фрагментами?
// Your current implementation
public void MyMethod(int a, int b)
{
MyPrivateMethod(a, b);
}
private void MyPrivateMethod(int a, int b)
{
var c = a + b;
// some more code
}
// Private method inlined
public void MyMethod(int a, int b)
{
var c = a + b;
// some more code
}
Кто называет (общественные) MyMethod
не будет в состоянии заметить разницу между этими двумя. Конечный результат тот же. Не имеет значения, есть ли вызов частного метода, потому что, насколько это касается публичного API, это не имеет значения. Вы можете встроить частный метод, заставить его уйти навсегда, а с точки зрения общественного потребителя ничего не меняется. Конечный результат - это единственное, что важно. Вы конечный результат теста можно наблюдать по коду потребителя. Не какая-то внутренняя тарабарщина.
Важная реализация заключается в следующем:
Правильно спроектированные SOLID код никогда не поставит вас в положение, которое потребует от вас сделать личное насмешки. Источник проблемы? Плохой дизайн.
Источник: How to mock private method - solutions
Угу. Грустно, но верно, ваш дизайн не так уж и хорош. В зависимости от того, хотите ли вы изменить это или нет, есть несколько подходов можно принять:
- не пытаются издеваться частные детали, сосредоточиться на общественном API (не помогает проблемы дизайна)
- извлекать частный метод в класс, вводить зависимость (долгосрочное решение, улучшает дизайн и делает код легко проверяемым)
- защищать частный метод, переопределять в тесте, как предложено в другом ответе (не помогает при разработке проблемы, может не дать ценный тест)
Какой бы вы ни выбрали, я lea до вас. Тем не менее, я еще раз подчеркнуть это - mocking private method не является проблемой модульного тестирования, библиотеки или инструментов - это проблема с дизайном и лучше всего разрешима как таковая.
На боковой ноте (если вы можете) не использовать NMock2. Это библиотека с последними изменениями с 2009 года. Это похоже на наличие 30-летнего автомобиля, который последний раз обслуживался 15 лет назад. В настоящее время есть намного лучшие (FakeItEasy, Moq, NSubstitute).
Закрытый метод представляет собой деталь реализации публичного метода. Вы должны тестировать его как часть тестирования общедоступного метода. Если метод ничего не сделал, вы бы все же считали, что ваши тесты общественного метода действительны? Если да, то почему вы это называете? – forsvarir
Я не был уверен. Если вообще мы должны проверить частный метод как часть общедоступного метода или нет. Имеет смысл протестировать его как часть общедоступного метода. – Siddhant
Тем не менее, если бы я просто хотел проверить, вызван ли этот частный метод или нет, то защита его будет, безусловно, помогать. – Siddhant