【发布时间】:2012-02-20 13:36:45
【问题描述】:
我的代码与此非常相似,但无法确定如何测试事件处理程序是否发生。
public class MyClass : MyAbstractClass
{
IFileSystem FileSystem;
public MyClass(IFileSystem myFileSys)
{
FileSystem = myFileSys;
FileSystem.EventHit += new EventHandler(FileSystem_EventHit);
}
public void FileSystem_EventHit(object sender, EventArgs e)
{
//Testing base.OnOutput is not possible which I wont go into
base.OnOutput("EventHit");
}
}
测试代码在这里:
[Test]
public void DoSomething_WhenCalled_EventFired()
{
var mock = new Moq.Mock<IFileSystem>();
MyClass plugin = new MyClass (mock.Object);
mock.Object.DoSomething();
mock.Raise(x => x.EventHit += null, new EventArgs());
//Verify/Assert that MyClass handled and did something in the event handler
}
【问题讨论】:
-
能否详细介绍一下WRT base.OnOutput,或许可以测试?
-
MyAbstractClass 是遗留的,MyClass 也是如此,因此它很混乱,需要大量设置来测试,所以我希望有一些方法可以测试而无需验证 base.OnOutput
-
常见场景;回顾性地编写单元测试。我不知道有什么捷径。每当我遇到这个问题时,我都会发现自己正在重构代码以便对其进行单元测试。
-
@MylesMcDonnell 希望我有这个选项 :)
-
听起来很难看,所以你必须编写单元测试而不使代码可测试,哎哟。一种不完美但实用的方法是接受某些类型是紧密耦合的,并围绕这些类型定义测试边界。不是严格意义上的单元测试,但在启用测试时可能对您有一些价值?
标签: c# .net unit-testing .net-4.0 tdd