to allow your tests/code to scale neatly you should decouple your code using an interface,这使得重构简单得多,otherwise by coupling your code you incur technical debt你可能添加
- 接口来解耦代码
- 一个模拟的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的状态,看看它是否成功o不是。
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;
}
凡功能是
上的单元测试顶部
你也有一组功能测试,所以单元测试将测试类的每一个方法(在适当情况下) ,功能测试套件将启动服务器的一个实例,然后功能测试将调用将与消息传递服务器联系的功能,然后检查输出(无论是数据库状态还是返回的信号)
来源
2010-12-04 12:07:23
Ben
但是,当Mock' (urhm)对象,用比较少的“meta”语言(比如ruby),你必须通过通知者或从一些你可以控制的地方传入。这是因为通告程序对象是直接在类中创建的。这适用于红宝石(欢呼!),但什么是好的和一般的策略。 – Daniel 2010-12-04 01:03:53