Хммм, вы можете проверить, что лямбда вызывается, создав макет для интерфейса, который имеет метод, соответствующий параметрам лямбды, и проверив, что:
public void Test()
{
var funcMock = new Mock<IFuncMock>();
Func<Customer, bool> func = (param) => funcMock.Object.Function(param);
var mock = new Mock<ICustomerRepository>();
mock.Object.Single(func);
funcMock.Verify(f => f.Function(It.IsAny<Customer>()));
}
public interface IFuncMock {
bool Function(Customer param);
}
Вышеприведенное может работать или не работатьВы, в зависимости от того, что метод Single
делает с выражением.Если это выражение будет проанализировано в операторе SQL или передано в Entity Framework или LINQ To SQL, то произойдет сбой во время выполнения.Однако, если он выполняет простую компиляцию выражения, то вам может это сойти с рук.
Компиляция выражений, о которой я говорил, выглядела бы примерно так:
Func<Customer, bool> func = Expression.Lambda<Func<Customer, bool>>(expr, Expression.Parameter(typeof(Customer))).Compile();
EDIT Если вы просто хотите убедиться, что метод был вызван с определенным выражением, вы можете сопоставить его с экземпляром выражения.
public void Test()
{
Expression<Func<Customer, bool>> func = (param) => param.Id == 1
var mock = new Mock<ICustomerRepository>();
mock.Object.Single(func);
mock.Verify(cust=>cust.Single(func));
}