验证事件处理程序存在于Moq vs Rhino Mocks中

时间:2012-02-20 16:05:07

标签: c# .net unit-testing moq rhino-mocks

我希望能够测试对象是否订阅了某个事件。在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();
}

2 个答案:

答案 0 :(得分:1)

我会提出事件并验证是否抛出了异常。无论如何,您可能需要检查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.");
}

我不确定您使用的是哪个单元测试框架,因此在assert部分中使用了fluent assertions。如果您使用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));
}

答案 1 :(得分:1)

看起来它是Moq http://code.google.com/p/moq/issues/detail?id=100

中缺少的一个错误/功能