Неприятная Лямбда-насмешка в хранилище Unitofwork - PullRequest
5 голосов
/ 19 сентября 2011

Я использую .net 4 с C #, EntityFramework 4 и Moq 4. Я пытаюсь смоделировать мой UnitOfWork, репозиторий и, наконец, вызов метода.

Вот код, который я используювозникли проблемы с

        var unitOfWorkMock = new Mock<UnitOfWork>();
        var cFieldRepositoryMock = new Mock<IRepository<CField>>();

        System.Linq.Expressions.Expression<Func<CField, bool>> query = (x) => x.CID == c && x.FID == parentFID;

        cFieldRepositoryMock.Setup(x => x.GetFirst(query));

Подпись метода для GetFirst:

          T GetFirst(Expression<Func<T, bool>> query = null,
        Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null);

CField:

public class CField
{
    public CField()
    {
       //do stuff
    }
    public int ID { get; set; }
    public int FID { get; set; }
    public int CID { get; set; }
}

То, что я ожидаю, произойдет: я ожидаю, что явызовите метод GetFirst моего cFieldRepositoryMock, он сопоставит лямбда-выражение, которое я передаю, с выражением, которое я определил в программе установки.

Что происходит: я получаю ошибку компилятора в назначении программы установки: «Дерево выражений можетне содержит вызов или вызов, который использует необязательные аргументы "

Я явно что-то делаю не так, я просто не уверен, что.Любой совет приветствуется, я новичок в модульном тестировании.

Спасибо!AFrieze

1 Ответ

8 голосов
/ 19 сентября 2011

Ошибка, которую вы получаете, кажется, на самом деле ограничение выражений :

Чтобы протестировать подобные вещи, подумайте об использовании It.IsAny (как уже предложил Карстен):

cFieldRepositoryMock.Setup(x => x.GetFirst(query, It.IsAny<Func<IQueryable<CField>, IOrderedQueryable<CField>>>()));
...