для точного масштабирования ваших тестов / кода вы должны разъединить ваш код с помощью интерфейса , что значительно упрощает обновление тестов после рефакторинга, в противном случае, связывая ваш код, вы несете техническую задолженность вы могли бы потенциально добавить
- интерфейс для развязки кода
- макет для DoSpecialStuff, чтобы проверить, что разъединенный код ведет себя так, как вы ожидаете
, если выгде при написании кода на C ++ он будет выглядеть примерно так:
Код уведомителя
Notifier.h
class Notifier : public I_Notifier
{
void _sendNotification( NotificationInstance * notification );
};
Notifier.cpp
void Notifier::_sendNotification( NotificationInstance * notification )
{
//do some stuff that needs testing
}
Интерфейс для уведомителя, это то, что добавляется в класс DoSpecialStuff для отделения кода I_Notifier.h
class I_Notifier
{
void sendNotification( NotificationInstance * notification ) { _sendNotification(notification); }
virtual void _sendNotification( NotificationInstance * notification )=0;
}
Макет, используемый для тестирования аспектов DoSpecialStuff, наш макет предполагает, что код уведомителей работает с нашими модульными тестами для DoSpecialStuff, которые просто хотят убедиться, что sendNotification получил название ,поэтому наш тест может просто проверить состояние send_notification_called, чтобы увидеть, было ли оно успешным или нет.
Mock_Notifier.h
struct Test_Notifier : public I_Notifier
{
Test_Notifier() : send_notification_called(false)
virtual void _sendNotification( NotificationInstance * instance )
{
send_notification_called = true;
}
bool send_notification_called;
};
Код DoSpecialStuff Обратите внимание, что этот класс теперь имеет интерфейс к классу уведомлений , который разъединяет код (поэтому нашему тесту больше не нужно включатьфактический класс, если мы не используем вызовы от него
DoSpecialStuff.cpp
class DoSpecialStuff
{
DoSpecialStuff( I_Notifier * n ) : notifier_(n) {}
void DoSpecialStuff::_myMethod( NotificationInstance * notification )
I_Notifier * notifier_;
}
void DoSpecialStuff::_myMethod( NotificationInstance * notification )
{
//do some stuff that needs testing
n.send_notification (notification )
}
Интерфейс
I_DoSpecialStuff.h
class I_DoSpecialStuff
{
void myMethod( NotificationInstance * notification ) { _myMethod(notification); }
virtual void _myMethod( NotificationInstance * notification )=0;
}
Где функциональность
- связаться с сервером обмена сообщениями и доставить сообщение
помимо ваших модульных тестов у вас также будет набор функциональных тестов, поэтому модульные тесты будут тестировать каждый метод классов (где это уместно), а набор функциональных тестов будет запускать экземпляр вашегосервер, а затем функциональные тесты будут вызывать функции, которые будут связываться с сервером обмена сообщениями, а затем проверять вывод (будь то состояние базы данных или возвращаемый сигнал)