我正在開發一個項目,我們也使用MVP和rhino mocks。我們所做的只是期望在每個測試中的所有事件訂閱。
private void SetupDefaultExpectations()
{
_mockView.Initializing += null; LastCall.IgnoreArguments();
_mockView.SavingChanges += null; LastCall.IgnoreArguments();
}
然後我們建立在IMockedObject(從RhinoMocks)一個擴展方法來觸發單元測試和未包裝的異常事件,以便他們可以在標準NUnit的方式可以預期的。
static class IMockedObjectExtension
{
public static void RaiseEvent(this IMockedObject mockView, string eventName, EventArgs args)
{
EventRaiser eventraiser = new EventRaiser(mockView, eventName);
try
{
eventraiser.Raise(mockView, args);
}
catch (TargetInvocationException ex)
{
throw ex.InnerException;
}
}
public static void RaiseEvent(this IMockedObject mockView, string eventName)
{
RaiseEvent(mockView, eventName, EventArgs.Empty);
}
}
這然後可以從該單元測試像這樣使用
using(_mocks.Record())
{
Expect.Call(dependency.GetInfo()).Return(someList);
}
using(_mocks.Playback())
{
Presenter presenter = new Presenter(_mockView, dependency);
(_mockView as IMockedObject).RaiseEvent("SavingChanges");
}
爲了消除演示測試之間的重複我們已重構這個到BasePresenterTest基類,它設置了該基本結構爲所有演示測試並將輔助方法公開給子類。
public abstract class BasePresenterTest<VIEW> where VIEW : IBaseView
{
protected MockRepository _mocks;
protected VIEW View { get; private set; }
protected abstract void SetUp();
protected abstract void TearDown();
protected abstract void SetupDefaultExpectations();
[SetUp]
public virtual void BaseSetUp()
{
_mocks = new MockRepository();
View = _mocks.CreateMock<VIEW>();
SetUp();
}
[TearDown]
public virtual void BaseTearDown()
{
TearDown();
View = null;
_mocks = null;
}
protected virtual void BaseSetupDefaultExpectations()
{
//Setup default expectations that are general for all views
SetupDefaultExpectations();
}
protected virtual IDisposable Record()
{
IDisposable mocksRecordState = _mocks.Record();
BaseSetupDefaultExpectations();
return mocksRecordState;
}
protected virtual IDisposable Playback()
{
return _mocks.Playback();
}
protected void RaiseEventOnView(string eventName)
{
(View as IMockedObject).RaiseEvent(eventName);
}
}
這消除了我們項目中測試的大量代碼。
我們仍然使用舊版本的RhinoMocks,但我會嘗試在我們移到更高版本時更新此版本。
來源
2008-12-03 14:33:49
maz
只是一個更新,因爲它可能會幫助其他人有這個相同的問題:我發現了我的致命缺陷。以我的新手方式,我沒有使用mock.DynamicMock <>創建視圖模擬,而是使用.CreateMock <>創建。傻我。那些「非定義的」方法調用導致了異常。 – jstephenson 2008-11-26 20:43:27