Я хотел бы провести модульное тестирование метода в классе, который я создал, но этот метод требует, чтобы сначала был вызван другой метод. Пример:
// This would work
MyClass myClass1 = new MyClass(mockDevice);
myClass1.Run(myDatastructure);
myClass1.Stop();
// This would throw an InvalidOperationException
MyClass myClass2 = new MyClass(mockDevice);
myClass2.Stop();
Run
запускает операцию на аппаратном устройстве, и Stop
, конечно, пытается остановить эту операцию (отправка команды сброса и запуск таймера тайм-аута).
В любом случае я хотел бы протестировать различные пост-условия вызова Stop
, но я бы не хотел звонить Run
, потому что я тестирую Stop
- не Run
! Я хотел бы что-то вроде этого:
MyClass myClass = new MyClass(mockDevice);
myClass.Stop();
Assert.IsTrue(mockDevice.ResetCalled);
Пока что я вижу только одно возможное решение, а именно: создание TestableMyClass
, которое наследуется от MyClass
, что позволяет установить правильное внутреннее состояние экземпляра MyClass
перед вызовом Stop
. Проблема с этим решением состоит в том, что я должен изменить свою реализацию MyClass
, чтобы иметь защищенные члены вместо частных, и мне не нравится идея изменить реализацию для тестирования это!
Должен ли я использовать это решение, есть ли ошибка в моем дизайне или есть более разумный способ сделать это?