验证Moq与Rhino Mocks中是否存在事件处理程序
本文关键字:是否 存在 事件处理 程序 Mocks Moq Rhino 验证 | 更新日期: 2023-09-27 18:25:07
我希望能够测试对象是否订阅了事件。在Rhino Mocks中,下面的代码验证了这一点,但我在Moq中找不到方法。
public class Presenter
{
IView view;
public Presenter(IView view)
{
this.view = view;
this.view.Load += new EventHandler(view_Load);
}
void view_Load(object sender, EventArgs e)
{
throw new Exception("Not implemented.");
}
}
[Test]
public void VerifyAttachesToViewEvents()
{
MockRepository mocks = new MockRepository();
IView viewMock = (IView)mocks.CreateMock(typeof(IView));
using (mocks.Record())
{
viewMock.Load += null;
LastCall.IgnoreArguments();
}
new Presenter(viewMock);
mocks.VerifyAll();
}
看起来Moq中缺少一个bug/功能http://code.google.com/p/moq/issues/detail?id=100
我将引发事件并验证是否引发了异常。不管怎样,你可能需要检查SUT中的一些逻辑是否被执行,而不仅仅是一个事件已经被订阅:
[Test]
public void VerifyAttachesToViewEvents()
{
// arrange
var mock = new Mock<IView>();
new Presenter(mock.Object);
// act
Action action = () => mock.Raise(view => view.Load += null, EventArgs.Empty);
// assert
action.ShouldThrow<Exception>()
.WithMessage("Not implemented.");
}
我不确定您使用的是什么单元测试框架,所以在断言部分使用了流畅的断言。如果你使用NUnit,代码可能是:
[Test]
public void VerifyAttachesToViewEvents()
{
// arrange
var mock = new Mock<IView>();
new Presenter(mock.Object);
// act & assert
Assert.Throws<Exception>(() =>
mock.Raise(view => view.Load += null, EventArgs.Empty));
}