簡體   English   中英

模擬從第三方類觸發事件

[英]Mock firing an event from 3rd party class

我正在嘗試編寫一個交互測試,該測試需要在我不擁有的類(C#4.0環境)中觸發事件:

public class DoNotOwn
{
  public event EventHandler<SomeEventArgs> SomeEvent;
}

DoNotOwn不提供受保護的OnSomeEvent來覆蓋,並且不實現任何接口或具有任何虛擬成員。 被測類中有一個DoNotOwn實例,並訂閱SomeEvent:

public class ClassUnderTest
{
  private DoNotOwn x;

  public SetupDoNotOwn(DoNotOwn arg)
  {
    x = arg;
    x.SomeEvent += MyEventHandler;
  }

  protected void MyEventHandler(object sender, SomeEventArgs args)
  {
    // Does work that needs to be tested
  }
}

我知道我可以為測試提供一個單獨的方法來執行MyEventHandler的內部功能,但是我想知道是否有辦法讓偽造的DoNotOwn觸發該事件。

我在環境中有RhinoMocks。 我試圖引發該事件的嘗試導致沒有事件觸發或抱怨“無效的呼叫,已使用上一個呼叫或未進行任何呼叫(請確保您正在調用虛擬...方法)”,例如與:

DoNotOwn stub = MockRepository.GenerateStub<DoNotOwn>();
stub.SomeEvent += null;
IEventRaiser eventer = LastCall.GetEventRaiser(); // InvalidOperationException

我願意嘗試起訂量。 在預算中沒有Typemock。

問題不在於您沒有“保護OnSomeEvent”。 通常,這是處理事件而不是觸發事件的名稱。

如果您不了解克里斯的回答,他會說您(因為您沒有DoNotOwn的抽象“ IDoNotOwn”),您可以創建一個實現IDoNotOwnWrapper的DoNotOwnWrapper。

interface IDoNotOwnWrapper
{
    event EventHandler<SomeEventArgs> SomeEvent;
}

class DoNotOwnWrapper : IDoNotOwnWrapper
{
    DoNotOwn _internal;
    public DoNotOwnWrapper()
    {
         _internal = new DoNotOwn();
         _internal.SomeEvent += SomeEvent;
    } 
    event EventHandler<SomeEventArgs> SomeEvent;
}

然后,您可以輕松地依賴於Wrapper類,並在模擬框架中模擬其Abstract接口。

我絕對建議您使用Moq,因為它的語法清晰,但是RhinoMock和Moq都能做到。

如果控制要測試的類,則可以包裝DoNotOwn類並模擬包裝器。 如果將來發生更改,這也可以使您對DoNotOwn類的接口進行某種程度的控制。

您還可以擴展DoNotOwn類,該類實現定義事件的接口。

public interface IClassDoNotOwn
{
    event EventHandler<SomeEventArgs> SomeEvent;
}

public class ExtendedDonNotOwn : ClassDoNotOwn, IClassDoNotOwn
{

}

測試方法可能是:

    [Test]
    private void TestMethod()
    {
        var classDoNotOwn = MockRepository.GenerateStub<IClassDoNotOwn>();
        var classUnderTest = new ClassUnderTest();

        classDoNotOwn.Raise(dno=> dno.SomeEvent += null, this, EventArgs.Empty);
        ......
        ......

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM