[英]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.