2010-04-14 8 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 받고 있어요 -이

가 훨씬 간단 버전은 잘 작동 (<Func<TEnterpriseObject,bool>><Func<TEnterpriseObject,int,bool>> 사이의 혼란) 사용에서 infered 할 수 없다고 ...

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

그래서 내가 무엇을 놓치고 있는지 잘 모르겠습니다 ... 아이디어입니까?

답변

0

그것은 멍청한 짓을했다 (?)
0

"표현식"은 표현식>이 아니라 Func < ...>이 두 가지가 있습니다. expression.Compile()을 수행하면 Func <> (필자는 머리 꼭대기에서이 글을 쓰고 있기 때문에 내가 틀렸다면 알려 주시기 바랍니다). 그것이 내가 원하는 곳의 종류를 알아낼 수 불평 그 이유는 ... .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(); 
       }); 
-