2010-08-11 3 views
3

Impossible de trouver la syntaxe.La méthode de vérification a été appelée avec une certaine expression linq (moq)

//class under test 
public class CustomerRepository : ICustomerRepository{ 
    public Customer Single(Expression<Func<Customer, bool>> query){ 
    //call underlying repository 
    } 
} 

//test 

var mock = new Mock<ICustomerRepository>(); 
mock.Object.Single(x=>x.Id == 1); 
//now need to verify that it was called with certain expression, how? 
mock.Verify(x=>x.Single(It.Is<Expression<Func<Customer, bool>>>(????)), Times.Once()); 

Aidez-nous s'il vous plaît.

Répondre

1

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)); 
} 
Questions connexes