Я пытаюсь протестировать службу приложений, используя 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).Я пришел к выводу, что это будет болезненно, но у меня много подобных тестов, и я хочу получить твердость сейчас, а не тонуть позже.
Это единственный вариант для инкапсуляции лямбдаВыражение внутри объекта и передать в хранилище и выполнить запрос?Я не хочу менять свой код только для своей среды тестирования, но я также не хочу тратить время на попытки подчинить эту вещь своей воле.