我正在开发一个项目,我们也使用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