2010-04-14 22 views
1

我正在使用一个moq-ed“Get Service”中的表达式,并且遇到了一个令人讨厌的问题。为了让这个测试正确运行,获取服务返回它应该的内容,中间有一位翻译人员需要您提供的内容,发送它并获取您真正想要的内容。所以,认为这很容易,我尝试了这个...... fakelist是TEntity对象(翻译,由UI使用),TEnterpriseObject是实际的持久性。Moq,一位翻译和一个表达

mockGet.Setup(mock => mock.Get(It.IsAny<Expression<Func<TEnterpriseObject, bool>>>())).Returns(
    (Expression<Func<TEnterpriseObject, bool>> expression) => 
     { 
      var items = new List<TEnterpriseObject>(); 
      var translator = (IEntityTranslator<TEntity, TEnterpriseObject>) ObjectFactory.GetInstance(typeof (IEntityTranslator<TEntity, TEnterpriseObject>)); 
      fakeList.ForEach(fake => items.Add(translator.ToEnterpriseObject(fake))); 
      items = items.Where(expression); 
      var result = new List<TEnterpriseObject>(items); 
      fakeList.Clear(); 
      result.ForEach(item => translator.ToEntity(item)); 
      return items; 
     }); 

我越来越有下items.where(表达)红色squigglie - 说,它不能从使用infered(<Func<TEnterpriseObject,bool>><Func<TEnterpriseObject,int,bool>>之间的混淆)

一个简单得多的版本的伟大工程...

mockGet.Setup(mock => mock.Get(It.IsAny<Expression<Func<TEntity, bool>>>())).Returns(
      (Expression<Func<TEntity, bool>> expression) => fakeList.AsQueryable().Where(expression)); 

所以我不知道我错过了什么......想法?

回答

0

这是一件愚蠢的 - .AsQueryable()是结果......这就是为什么有人抱怨它无法弄清楚什么样的,我想的

 mockGet.Setup(mock => mock.Get(It.IsAny<Expression<Func<TEnterpriseObject, bool>>>())).Returns(
      (Expression<Func<TEnterpriseObject, bool>> expression) => 
       { 
        var items = new List<TEnterpriseObject>(); 
        var translator = 
         (IEntityTranslator<TEntity, TEnterpriseObject>) 
         ObjectFactory.GetInstance(typeof (IEntityTranslator<TEntity, TEnterpriseObject>)); 
        fakeList.ForEach(fake => items.Add(translator.ToEnterpriseObject(fake))); 
        var filtered = items.AsQueryable().Where(expression); 
        var results = new List<TEntity>(); 
        filtered.ToList().ForEach(item => results.Add(translator.ToEntity(item))); 
        return results.AsQueryable(); 
       }); 
(?)
0

“expression”是Expression>,而不是Func < ...> ...这些是两个不同的东西。如果你做expression.Compile(),我相信它会给你一个功能<>(我只是把它写在我的头顶,所以让我知道如果我错了)。