麻烦嘲笑Lambda与Unitofwork的存储库

AFr*_*eze 5 c# unit-testing moq repository unit-of-work

我正在使用.net 4与C#,EntityFramework 4和Moq 4.我正在尝试模拟我的UnitOfWork,一个Repository,最后是一个方法调用.

这是我遇到问题的代码

        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));
Run Code Online (Sandbox Code Playgroud)

GetFirst的方法签名:

          T GetFirst(Expression<Func<T, bool>> query = null,
        Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null);
Run Code Online (Sandbox Code Playgroud)

CField:

public class CField
{
    public CField()
    {
       //do stuff
    }
    public int ID { get; set; }
    public int FID { get; set; }
    public int CID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我期望发生的事情:我期待我调用我的cFieldRepositoryMock的GetFirst方法,它将匹配我传入的lambda表达式与我在Setup中定义的表达式.

发生了什么:我在安装程序分配上遇到编译器错误:"表达式树可能不包含使用可选参数的调用或调用"

我显然做错了什么,我只是不确定是什么.任何建议表示赞赏,我对单元测试相当新.

谢谢!AFrieze

Dav*_*vid 8

您收到的错误似乎实际上是表达式限制:

对于像这样的单元测试,请考虑使用It.IsAny(正如Carsten已经建议的那样):

cFieldRepositoryMock.Setup(x => x.GetFirst(query, It.IsAny<Func<IQueryable<CField>, IOrderedQueryable<CField>>>()));
Run Code Online (Sandbox Code Playgroud)