С помощью оператора Linq To Sql доступ к поддельному объекту был доступен неизвестное количество раз. - PullRequest
2 голосов
/ 03 июня 2011

Я пишу модульные тесты для метода, который использует объект, который я держу в качестве переменной сеанса, доступ к которой осуществляется сервисом, который я назвал «SessionService».Полный метод выглядит следующим образом:

return SessionService.Items.OrderBy(x => x.Id)
    .FirstOrDefault(x => x.Required && !x.Complete);

Я - мой юнит-тест, я издеваюсь над сервисом, чтобы вернуть список предметов:

var mocks = new MockRepository();

var mockSessionService = mocks.StrictMock<ISessionService>();
using (mocks.Record())
{
    Expect.Call(mockSessionService.Items).IgnoreArguments()
        .Return(MockItems);
}
ObjectFactory.Inject(typeof(ISessionService), mockSessionService);

var inventoryService = 
    ObjectFactory.GetInstance<IInventorySurveyService>();

var item = inventoryService.GetNextSurveyItem();

Assert.IsNotNull(item);
Assert.That(item.Id == Guid.Parse("26fd9364-d831-477a-9faf-25271562f144"));

Что я нахожу, так эточто моя инструкция linq, кажется, ссылается на мой список "Items" более одного раза, потому что мои модульные тесты выдают ошибку, если я не добавлю ".Repeat.Any ()" к моей инструкции "Expect":

Expect.Call(mockSessionService.Items).IgnoreArguments()
    .Return(MockItems).Repeat.Any();

Это правильно?Сколько раз на мой список ссылаются?

Редактировать: добавлено больше примера кода

Больше редактирования :

Кажется, что мы могли бы бытьнедопонимание друг друга.Я понимаю, что код, который вы разместили, состоит в том, чтобы проверить с помощью моего модульного теста, что вызов к моей SessionService происходит только один раз.

Я использую мой вызов «Expect» для макетирования этого вызова в SessionService и возврата ожидаемого ответа, и что мой тест на самом деле ищет для проверки - это то, что в утверждениях Assert внизумоего теста.(Я думаю, что я использую это неправильно - я должен был использовать заглушку вместо макета?)

То, что я спрашивал в своем первоначальном вопросе, не имело никакого отношения к результатам моего модульного теста, яМне было просто интересно, сколько раз SessionService вызывается в этом операторе, когда я выполняю свой модульный тест:

return SessionService.Items.OrderBy(x => x.Id)
    .FirstOrDefault(x => x.Required && !x.Complete);

Я просто хочу получить ответ, мне не нужно знать, как проверить ответ (хотяЯ знаю, как это сделать сейчас - спасибо!)

1 Ответ

1 голос
/ 03 июня 2011

Прежде всего, вызов метода IgnoreArguments в этом случае не является необходимым, поскольку вы выполняете макет свойства, который никогда не будет запрашивать аргументы.

Тогда использование Repeat.Any скрывает настоящую проблему. Рекомендуется проверить, сколько раз должен вызываться ваш метод. Если вы ожидаете только один раз, я предлагаю вам для простоты поставить предложение Repeat.Once ().

Хорошо, эта строка показывает, что вы заменяете реальный экземпляр на фиктивный:

ObjectFactory.Inject(typeof(ISessionService), mockSessionService);

Затем вы должны прекратить запись и начать проверку ваших записей до и после вызова метода. Примерно так:

mocks.ReplayAll();

var item = inventoryService.GetNextSurveyItem();

mocks.VerifyAll();

Скажите, решат ли они вашу проблему, спасибо за голосование.

Привет.

...