验证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与Rhino Mocks中是否存在事件处理程序

看起来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));
}