2012-01-19 4 views
3

에서 ObjectResult를 채우는 방법 저장 프로 시저를 사용하는 메서드를 테스트하기 위해 위조 메서드가 만들어졌습니다. 이 메소드는 int리스트를 리턴합니다.List <>

Cannot implicitly convert type 'bool' to 'System.Data.Objects.ObjectResult<int?>' 

실패

이런 식으로 뭔가 ...

public virtual ObjectResult<Nullable<int>> available_IDs(...) 
    { 
     List<int?> fakeAvailableIDList = new List<int?>(); 
     fakeAvailableIDList.Add(1); 
     fakeAvailableIDList.Add(2); 
     fakeAvailableIDList.Add(3); 

     ObjectResult<Nullable<int>> result = fakeAvailableIDList.All(m => m > 0); 
     return result; 
    } 

Cannot implicitly convert type 'System.Collections.Generic.List<int?>' to 'System.Data.Objects.ObjectResult<int?>' 
,369을 제공

ObjectResult<Nullable<int>> result = fakeAvailableIDList.All(m => m > 0); 

(다른 것들 amoungst에) 시도

ObjectResult에 List <을 어떻게 얻을 수 있습니까? True 또는 False이 컬렉션의 여부 모든 요소에 따라 .All 반환 지정된 조건을 충족하기 때문에

답변

3

라인

fakeAvailableIDList.All(m => m > 0); 

부울을 반환합니다.

따라서 ObjectResult 유형의 변수는 Bool 유형의 변수로 설정할 수 없습니다.

ObjectResultObjectResult<T> 유형에는 숨겨진 생성자가 있으므로 사용자가 마음대로 인스턴스를 만들 수 없습니다. 또한 ObjectResult<T> 유형은 봉인되어 확장 할 수 없습니다. 따라서 Enumerable에서 ObjectResult을 쉽게 만들 수있는 방법을 찾고 있다면 행운이 없을 수도 있습니다.

가장 쉬운 방법은 테스트하려는 메서드에서 사용하는 형식을 변경하는 것입니다. 그래서, 그 방법은 서명이있는 경우 :

void Foo(ObjectResult<int?> result); 

변경 그것에 : 당신이 방법을 테스트 할 수있는 가짜 컬렉션을 만들 수 있습니다, 그리고 당신은 여전히 ​​수 있습니다

void Foo(IEnumerable<int?> result); 

ObjectContext<int?>IEnumerable<int?>까지 확장되어 있기 때문에 ObjectContext<int?> 유형의 메서드를 전달할 수 있습니다.

+0

감사합니다. Ken, 나는 분명히 뭔가를 놓치지 않았습니다. 이 방법은 엔티티 프레임 워크 컨텍스트의 가짜에 있으므로 함수 서명을 변경할 수 없습니다. 그것을 흉내 내기 위해 두더지를 사용할 수도 있습니다. – PhilW

+0

EF 6.1.3부터 ​​ObjectResult 의 생성자가 보호되고 클래스가 더 이상 봉인되지 않습니다.즉 상속을 허용, 당신은 MyObjectResult 만들 수 있습니다 ObjectResult , 목록 이 전달 될 수 있으며, GetEnumerator를가 예를 오버라이드 (override) 할 수 있습니다. _list.GetEnumerator이며 기본 ObjectResult 이 반환되는 곳이면 파생 클래스를 사용할 수 있습니다. – panpawel

1

나는 이것이 이미 답변되었다는 것을 알고 있지만, 필자가 생각해 낸 해결책은 특정 Linq 확장을 ObjectResult<T>에서 조롱하는 것이다. 예를 들어

는 :

Mock.Get(PortalEntitiesMock).Setup(m => m.ExecuteSqlQuery(It.Is<String>(x => x.ToUpper().StartsWith("SELECT"))).FirstOrDefault()).Returns<string>(p=>p).Verifiable(); 

그래서, 당신은 O bjectResult<T> 객체하지 않을 경우 실제 ObjectResult<T>에 개별 항목을 조롱 할 수 있습니다.

관련 문제