2012-08-24 55 views
5

這裏是父類代碼實現的部分:試驗方法嘲笑處理如何在使用Moq的測試中引發事件?

handler.FooUpdateDelegate += FooUpdate(OnFooUpdate); 
protected abstract void OnFooUpdate(ref IBoo boo, string s); 

我:

Mock<IHandler> mHandler = mockFactory.Create<IHandler>(); 

這...

mHandler.Raise(x => x.FooUpdateDelegate += null, boo, s); 

...不加工。它說:

System.ArgumentException:無法找到附加或分離方法的事件無效set_FooUpdateDelegate(FooUpdate)。

我想提高OnFooUpdate所以它觸發代碼在子類中測試。

問題:我該如何使用Moq提升委託(不常見事件處理程序)?

如果我完全錯過了這一點,請啓用我。

回答

8

它看起來像你試圖提出一個委託,而不是一個事件。這是嗎?

你的代碼沿着這個方向嗎?使用界面

public interface IMyClass 
{ 
    FooUpdateDelegate FooUpdateDelegate { get; set; } 
}  

public class MyClass : IMyClass { 
    public FooUpdateDelegate FooUpdateDelegate { get; set; } 
} 

public class MyWrapperClass { 

    public MyWrapperClass(IMyClass myclass) { 
     myclass.FooUpdateDelegate += HandleFooUpdate; 
    } 

    public string Output { get; private set; } 

    private void HandleFooUpdate(ref int i, string s) { 
      Output = s; 
    } 

} 


[TestMethod] 
public void MockingNonStandardDelegate() 
{ 

    var mockMyClass = new Mock<IMyClass>(); 
    // Test fails with a Null Reference exception if we do not set up 
    // the delegate property. 
    // Can also use 
    // mockMyClass.SetupProperty(m => m.FooUpdateDelegate); 

    mockMyClass.SetupAllProperties(); 

    var wrapper = new MyWrapperClass(mockMyClass.Object); 

    int z = 19; 
    mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); 

    Assert.AreEqual("ABC", wrapper.Output); 

} 
+0

大答案把版本:

public delegate void FooUpdateDelegate(ref int first, string second); public class MyClass { public FooUpdateDelegate FooUpdateDelegate { get; set; } } public class MyWrapperClass { public MyWrapperClass(MyClass myclass) { myclass.FooUpdateDelegate += HandleFooUpdate; } public string Output { get; private set; } private void HandleFooUpdate(ref int i, string s) { Output = s; } } 

如果是這樣,那麼你就可以直接調用myClass的FooUpdateDelegate像這樣

[TestMethod] public void MockingNonStandardDelegate() { var mockMyClass = new Mock<MyClass>(); var wrapper = new MyWrapperClass(mockMyClass.Object); int z = 19; mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); Assert.AreEqual("ABC", wrapper.Output); } 

編輯。我要提到的一件事是,您可能必須通過調用mockMyClass.SetupAllProperties() – Eternal21

+1

@ Eternal21來保留FooUpdateDelegate屬性。Mock 正在使用MyClass中屬性的具體實現,因此它可以按原樣運行。如果我們嘲笑一個接口(比如IMyClass),那麼就沒有具體的實現,並且需要在模擬上設置屬性。 – AlanT

+0

這就是我的情況。 – Eternal21

相關問題