C#单元测试复杂处理程序网络

时间:2012-12-18 18:36:35

标签: c# unit-testing moq

我有一个相当复杂的程序架构,逻辑很少,但传递了很多事件处理程序。我正在构建一个服务器框架的框架,我有以下类:

Core,听取:

CommHandler,听取:

CommLayer,听取:

IServerMock,我用模拟框架(MOQ)来存根。

通过事件触发单元测试此类关系的最佳方法是什么?我知道单元测试应该是非常孤立和细化的东西,但我能想到测试的唯一方法是测试整个过程并检查Core的最终输出。

2 个答案:

答案 0 :(得分:5)

您需要为每个类创建一个抽象,因此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实现。

答案 1 :(得分:3)

听起来你可以模拟事件并检查侦听器是否执行了正确的操作(即调用自己的事件)。例如:

// 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);

您可能希望在每个级别执行此类操作,以便您知道如果每个级别之间的交互正常工作,整个链将正常工作。