Метод проверки вызван с определенным выражением linq (moq) - PullRequest
3 голосов
/ 11 августа 2010

Не могу понять синтаксис.

//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());

Пожалуйста, помогите.

1 Ответ

1 голос
/ 13 августа 2010

Хммм, вы можете проверить, что лямбда вызывается, создав макет для интерфейса, который имеет метод, соответствующий параметрам лямбды, и проверив, что:

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));
}
...