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