【问题标题】:Trouble Mocking Lambda withing Unitofwork's Repository在 Unitofwork 存储库中模拟 Lambda 时遇到问题
【发布时间】:2011-09-19 16:14:21
【问题描述】:

我正在使用带有 C#、EntityFramework 4 和 Moq 4 的 .net 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);

C字段:

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 表达式与我在设置中定义的表达式。

发生了什么: 我在设置分配时遇到编译器错误:“表达式树可能不包含使用可选参数的调用或调用”

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

谢谢! 弗里兹

【问题讨论】:

  • 能否发布声明 if CField 和 getfirst() 的方法签名?
  • 嗨大卫,我添加了请求的信息。我无法发布整个 CField 类,因此我发布了具有正确类型和可访问性级别的相关字段。
  • 您是否尝试过为 orderBy-Argument 添加一个参数(使用 It.IsAny<...> 或 null)?我不确切知道,但我认为 Moq 正在使用 Expressions 本身,我认为您必须在此处提供 all 参数。

标签: c# unit-testing repository moq unit-of-work


【解决方案1】:

您收到的错误似乎实际上是 limitation of expressions:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2017-03-28
    • 2014-06-25
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多