2012-02-20 44 views
1

我希望能够测试一个对象是否订阅了一个事件。在Rhino Mocks中,下面的代码验证了这一点,但是我无法在Moq中找到一种方法。验证事件处理程序存在于Moq vs Rhino Mocks

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(); 
} 

回答

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."); 
} 

我不知道是什么的单元测试框架使用,所以杠杆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)); 
} 
+0

你能筹集 – Jon 2012-02-20 16:44:19

+0

更新我的回答与代码 – 2012-02-20 16:47:09

+0

我时提供的代码示例使用Moq框架,您可以将代码应用于该框架吗? – Jon 2012-02-20 17:03:52