代码之家  ›  专栏  ›  技术社区  ›  Dave Swersky

与MOQ自定义匹配

  •  3
  • Dave Swersky  · 技术社区  · 14 年前

    当我设计一个应用程序时,我正试图成为一个好的TDD公民。我使用的是moq,我遇到了一个存储库问题。

    我的存储库有一个查找方法:

    public IEnumerable<T> Find(Expression<Func<T, bool>> where)
            {
                return _objectSet.Where(where);
            }
    

    然后我试图建立一个仓库的模拟模型:

    mock.Setup(m => m.Find(c => c.ConferenceID == conferenceID))
                    .Returns(ConferenceTestObjectContainer.CreateConferences().Where(c => c.ConferenceID == conferenceID).ToList());
    

    如果我在测试中直接对模拟进行测试,那么测试就可以工作,但是如果我将模拟注入到我的生产代码(本例中是一个ASP.NET页面)并测试page方法,那么它就不工作。

    Justin Etheredge在他的帖子中解决了这个问题 here . 问题是,调用和安装程序之间的比较器无法很好地处理表达式。

    我遇到的问题是他的比较器函数:

    public static Expression<Func<T,bool>> AreEqual<T>(Expression<Func<T,bool>> expr)
    {
        return Match<Expression<Func<T, bool>>>
            .Create(t => t.ToString() == expr.ToString());            
    }
    

    这会引发编译器错误:

    无法根据用法推断方法“moq.match.create(system.predicate)”的类型参数。尝试显式指定类型参数。

    我知道编译器无法推断“t”的类型,但我不清楚如何修复它。好的Etheredge先生让这个工作成功了,但我不明白我做错了什么。

    短暂性脑缺血发作

    2 回复  |  直到 13 年前
        1
  •  0
  •   Dave Swersky    14 年前

    好吧,所以这个问题要讨论了…

    对于记录,我通过派生一个新的特定于实体的存储库来解决这个问题,并添加了findbyid()方法,这个方法非常有效。

        2
  •  0
  •   Custodio    13 年前

    你为什么不用这样的东西:

    public static Expression<Func<T,bool>> AreEqual<T>(Expression<Func<T,bool>> expr)
    {
        return Match.Create<Expression<Func<T, bool>>>(t => t.ToString() == expr.ToString());            
    }
    

    以这种方式,我也在处理通用的。