簡體   English   中英

C#單元測試復雜處理程序網絡

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM