2010-04-14 48 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(),我相信它會給你一個功能<>(我只是把它寫在我的頭頂,所以讓我知道如果我錯了)。