AssertWasCalled在SystemUnderTest中的方法

时间:2012-02-15 02:40:17

标签: c#-4.0 tdd rhino-mocks

我正在进入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中获取的值存根并断言我对该对象的操作结果。

有人可以确认并解释一下吗?

1 个答案:

答案 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

这样的某些人