我有一个相当复杂的程序架构,逻辑很少,但传递了很多事件处理程序。我正在构建一个服务器框架的框架,我有以下类:
Core
,听取:
CommHandler
,听取:
CommLayer
,听取:
IServerMock
,我用模拟框架(MOQ)来存根。
通过事件触发单元测试此类关系的最佳方法是什么?我知道单元测试应该是非常孤立和细化的东西,但我能想到测试的唯一方法是测试整个过程并检查Core的最终输出。
答案 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);
您可能希望在每个级别执行此类操作,以便您知道如果每个级别之间的交互正常工作,整个链将正常工作。