AssertWasCalled для метода в SystemUnderTest - PullRequest
2 голосов
/ 15 февраля 2012

Я вхожу в TDD;используя nUnit и RhinoMocks 3.5.

Я пытаюсь выяснить, как AssertWasCalled для метода в SystemUnderTest (SUT).Насколько я понимаю, вы не можете издеваться над тестируемой системой.Фактически, мой текущий тест приводит к исключению, потому что я использую AssertWasCalled на SUT.

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
}

Как я могу утверждать, что GetOrders был вызван в SUT?Я не смог выяснить это в документах.

Любая помощь очень ценится.

Редактировать:

Я понимаю, что метод GetOrders в SUT должен быть закрытым.Я вернулся к «Искусству модульного тестирования» Роя Ошерова, чтобы узнать, как тестировать частные методы.Рой говорит, что делать метод публичным (для проверки) не обязательно плохо, поэтому я буду держать его открытым.

Итак, я написал тест для GetOrders и утверждаю возвращаемое значение ShouldBe список заказов.Тем не менее, я считаю, что мне нужно реструктурировать свой тест для OnViewLoad_GetOrders, указав значение, полученное из GetOrders, и подтвердив результаты моих действий с этим объектом.

Может кто-нибудь подтвердить и объяснить?

1 Ответ

0 голосов
/ 15 февраля 2012

Нельзя использовать 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

...