Насмешливая лямбда в носорогах издевается - PullRequest
4 голосов
/ 07 апреля 2010

Я пытаюсь использовать Rhino Mocks, чтобы высмеивать следующую лямбду, но продолжаю бить кирпичную стену

var result = rep.Find<T>(x => (x as IEntity).ID == (entity as IEntity).ID).FirstOrDefault();

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 08 апреля 2010

Нашел ответ, который был после

repository.Expect(action => action.Find<Entity>(x => x.ID == 0))
          .IgnoreArguments()
          .Return(entities)
          .Repeat
          .Any();
5 голосов
/ 07 апреля 2010

В модульном тесте у вас есть тестируемая система (SUT) и ее соавторы. Цель насмешки состоит в том, чтобы заменить соавторов чем-то, что вы имеете полный контроль. Таким образом, вы можете настроить различные тестовые случаи и сосредоточиться на тестировании только поведения тестируемой системы и ничего больше.

В этом случае я предполагаю, что rep объект - это SUT. Лямбда, которую вы передаете методу SUT Find, может рассматриваться как соавтор. Поскольку у вас уже есть полный контроль над этой лямбдой, не имеет смысла пытаться высмеивать ее с помощью Rhino Mocks.

Я все равно попытаюсь привести пример модульного теста, включающего Rhino Mocks и лямбды ;-) Это пример теста, который создает заглушку предиката, которая всегда возвращает false, и которая проверяет, что метод Find действительно вызвал предикат:

[Test]
public void Find_returns_nothing_if_predicate_always_false()
{
   var predicateStub = MockRepository.GenerateStub<Func<Entity,bool>>();
   predicateStub.Stub(x => x(Arg<Entity>.Is.Anything)).Return(false);

   var repository = new Repository();
   var entities = repository.Find(predicateStub);

   Assert.AreEqual(0, entities.Count(), 
      "oops, got results while predicate always returns false");
   predicateStub.AssertWasCalled(x => x(Arg<Entity>.Is.Anything));
}

Конечно, как и в вашем собственном примере, вам не нужны здесь Rhino Mocks. Смысл лямбда-синтаксиса в том, чтобы упростить предоставление реализации на месте:

[Test]
public void Find_returns_nothing_if_predicate_always_false()
{
   bool predicateCalled = false;
   Func<Entity,bool> predicate = x => { predicateCalled = true; return false; };

   var repository = new Repository();
   var entities = repository.Find(predicate);

   Assert.AreEqual(0, entities.Count(), 
      "oops, got results while predicate always returns false");
   Assert.IsTrue(predicateCalled, "oops, predicate was never used");
}
0 голосов
/ 19 июня 2013

таким образом, мы не можем выйти ... потому что из-за IgnoreArguments (), он никогда не войдет внутрь и увидит значение аргументов, и мы пройдем через. Но основная проблема с этим подходом - написание AssertWasCalled (некоторое лямбда-выражение) невозможно, потому что теперь в части Assert он показывает ошибку, как ExpectaionViolationException, которая не обрабатывается кодом пользователя

...