[英]C# Unit Test Complex Handler Network
我有一個相當復雜的程序架構,只有很少的邏輯但很多事件處理程序傳遞。 我正在構建一個服務器框架的框架,我有以下類:
Core
,聽取:
CommHandler
,聽取:
CommLayer
,聽取:
IServerMock
,我用一個IServerMock
框架(MOQ)存根。
這種由事件觸發的單元測試關系的最佳方法是什么? 我知道單元測試應該是非常孤立和細化的東西,但我能想到測試的唯一方法是測試整個過程並檢查Core的最終輸出。
您需要為每個類創建一個抽象,因此Core
依賴於ICommHandler
而不是CommHandler
等等。 依賴項應該通過構造函數提供,這樣您就可以輕松地單獨測試每個類,因為您可以模擬它的依賴性。
public class Core
{
private ICommHandler commHandler;
public Core(ICommHandler commHandler)
{
this.commHandler = commHandler;
}
}
在您的生產代碼中,您可以執行以下操作:
var core = new Core(new CommHandler());
雖然最好使用IOC容器來管理對象的實例化,因為CommHandler
有它自己的依賴項,但你應該分別研究它。
然后在你的單元測試中,你可以這樣做:
[Test]
public void TestSomeCommHandlerEvent()
{
var mockCommHandler = new Mock<ICommHandler>();
// set up the mock
var core = new Core(mockCommHandler.Object);
}
這樣做允許您使用可以配置其行為的模擬替換測試中的ICommHandler實現。
聽起來你可以只是模擬事件並檢查監聽器是否執行了正確的操作(即調用自己的事件)。 例如:
// Create objects
var commLayerMock = new Mock<ICommLayer>();
var commHandler = new CommHandler(commLayerMock.Object);
// subscribe to CommHandler event
bool raised = false;
commHandler.OnCommHandlerEvent += delegate { raised = true; };
// Raise CommLayer event, ensure CommHandler event was subsequently raised
commLayerMock.Raise(m => m.OnCommLayerEvent += null, new CommLayerEventArgs());
Assert.True(raised);
您可能希望在每個級別執行此類操作,以便您知道如果每個級別之間的交互正常工作,整個鏈將正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.