Я пытаюсь протестировать службу приложений, используя Moq 4.0.10827 (на NuGet), и мне нужно запросить репозиторий:
public class MyService
{
Repository<MyObject> _Repo;
public MyObject Get (string SomeConstraint)
{
return _Repo
.GetTheFirstOneOrReturnNull (M => M.Constraint.Equals (
SomeContraint, StringComparison.InvariantCultureIgnoreCase
)); // GetTheFirstOneOrReturnNull takes a Func<MyObject, bool>
}
}
Как воспроизвести лямбда-выражение с помощью Moq? Я продолжаю получать исключение «Неподдерживаемое выражение».
Вот идея того, что я уже делаю:
[TestMethod]
public void GetByMyConstraintShouldReturnWithMyObject ()
{
// Arrange
const string MyConstraint = "Constraint";
MyObject Expected = new MyObject { Constraint = MyConstraint };
Mock<Repository<MyObject>> MockRepo = new Mock<Repository<MyObject>> ();
MockRepo.Setup (x => x.GetTheFirstOneOrReturnNull (M => M.Constraint.Equals (MyConstraint, StringComparison.InvariantCultureIgnoreCase)))
.Returns (Expected).Verifable ();
MyService Service = new MyService (MockRepo.Object);
// Act
MyObject Result = Service.Get (MyConstraint);
// Assert
Assert.AreSame (Expected, Result);
MockRepo.Verify ();
}
Я просмотрел некоторые другие ответы, но я не могу понять, что я делаю неправильно (по общему признанию, «нуб» с Moq). Я пришел к выводу, что это будет больно, но у меня впереди много подобных тестов, и я хочу стать твердым сейчас, а не тонуть позже.
Является ли единственным вариантом инкапсулировать лямбда-выражение внутри объекта, передать его в репозиторий и выполнить запрос? Я не хочу менять свой код только для среды тестирования, но и не хочу тратить время на то, чтобы подчинить его своей воле.