在Unitofwork's储存库中模拟Lambda存在问题

本文关键字:模拟 Lambda 存在 问题 储存库 Unitofwork | 更新日期: 2023-09-27 18:08:57

我使用。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; }
}

我期望发生的事情:我期望当我调用cFieldRepositoryMock的GetFirst方法时,它将匹配我传入的lambda表达式,而不是我在设置中定义的表达式。

发生了什么:我得到一个编译器错误的设置分配:"表达式树可能不包含使用可选参数的调用或调用"

我显然做错了什么,我只是不确定是什么。任何建议都很感激,我对单元测试相当陌生。

谢谢!AFrieze

在Unitofwork's储存库中模拟Lambda存在问题

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

要对这样的东西进行单元测试,可以考虑使用It。IsAny(正如Carsten已经建议的):
cFieldRepositoryMock.Setup(x => x.GetFirst(query, It.IsAny<Func<IQueryable<CField>, IOrderedQueryable<CField>>>()));