Hmmm, vous pouvez vérifier que le lambda est appelé en créant une maquette pour une interface qui a une méthode correspondant aux paramètres lambda et en vérifiant que:
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);
}
La puissance au-dessus ou pourrait ne pas fonctionner pour vous , en fonction de ce que fait la méthode Single
avec l'expression. Si cette expression est analysée dans une instruction SQL ou est passée à Entity Framework ou à LINQ To SQL, elle tomberait en panne à l'exécution. Si, cependant, il fait une simple compilation de l'expression, alors vous pourriez s'en tirer avec.
La compilation d'expression dont je parlais ressemblerait à quelque chose comme ceci:
Func<Customer, bool> func = Expression.Lambda<Func<Customer, bool>>(expr, Expression.Parameter(typeof(Customer))).Compile();
EDIT Si vous voulez simplement vérifier que la méthode a été appelée avec une certaine expression, vous pouvez faire correspondre le cas d'expression.
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));
}