我正在进入TDD;使用nUnit和RhinoMocks 3.5。
我正在试图弄清楚如何在SystemUnderTest(SUT)中的方法上使用AssertWasCalled。我的理解是你无法模拟被测系统。事实上,我当前的测试导致异常,因为我在SUT上使用了AssertWasCalled。
OrdersPresenter:
public void OnViewLoad_GetOrders()
{
var orders = GetOrders();
View.Model.Orders = orders;
}
public List<Orders> GetOrders()
{
return _ordersRepository.GetAll();
}
OrdersPresenterTest:
_ordersPresenter = new OrdersPresenter(_view, _ordersRepository);
[Test]
public void OnViewLoad_GetOrders_Should_Call_GetOrders()
{
_view.Raise(v => v.LoadOrders += _ordersPresenter.OnViewLoad_GetOrders, view, new EventArgs);
_ordersPresenter.AssertWasCalled(d => d.GetOrders); // Getting non-mock exception here
}
如何在SUT中调用断言GetOrders?我无法在文档中找到它。
非常感谢任何帮助。
修改
我理解SUT中的GetOrders方法应该是私有的。我通过Roy Osherove的单元测试艺术回去看看如何测试私有方法。罗伊说,公开一种方法(进行测试)不一定是坏事,所以我会把它公开。
所以我为GetOrders编写了一个测试,并断言返回值 ShouldBe 一个订单列表。也就是说,我相信我需要重新构建我对OnViewLoad_GetOrders的测试,方法是将我从GetOrders中获取的值存根并断言我对该对象的操作结果。
有人可以确认并解释一下吗?
答案 0 :(得分:0)
您不能在未模拟的对象上使用AssertWasCalled()
。只需通过接口抽象类OrdersPresenter
(使用Extract Interface重构技术)然后
var ordersPresenter = MockRepository.GenerateMock<IOrderRepository>();
view.Raise(...);
_ordersPresenter.AssertWasCalled(d => d.GetOrders);
顺便说一句,
对我来说,目前还不清楚为什么RhinoMocks没有为AssertWasCalled使用泛型参数约束
public static void AssertWasCalled<T>(this T mock, Action<T> action,
Action<IMethodOptions<object>> setupConstraints)
基本上T
不受限制,但我相信最好将其限制为像IMockMarkerInterface