В модульном тесте у вас есть тестируемая система (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");
}