2012-02-20 56 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