2017-01-20 2 views
0

질문은 꽤 간단합니다. IDocumentClient (주요 DocumentDB .NET 클라이언트)를 Moq'ed했습니다. 나는 ExecuteStoredProcedureAsync() 메소드를 Moq'ing하고있다. StoredProcedureResponse 유형 (구체적인 유형)을 반환하지만 인터페이스가 잠겨 있습니다.StoredProcedureResponse를 모방하는 방법

방금 ​​StoredProcedureResponse를 만들고 내 페이로드를 응답 속성에 포함시킬 수 있다고 생각했지만 설정자는 비공개입니다. 게다가 유일한 생성자는 매개 변수가 없습니다.

무엇이 여기에 있습니까? 메서드가 인터페이스 유형 (IStoredProcedureResponse)을 반환하는 경우 이상적이지만 제어 할 수는 없습니다. 내가 IDocumentClient 주위에 래퍼를 작성할 수 있다는 것을 알았지 만 그것은 실현 가능하지 않다.

내가 생각할 수있는 유일한 사실은 "새로운"키워드로 속성을 확장하고 강제로 덮어 쓰는 것입니다. 그러나 실제 호출 코드에서 런타임 유형과 다운 캐스트를 확인하는 끔찍한 해킹이 있습니다. 무시 리소스 속성을 사용하십시오.

+0

테스트 하시겠습니까? 귀하는 귀하의 질문에 언급하지 않았습니다. – CodingYoshi

+0

IDocumentClient.ExecuteStoredProcedureAsync() 메서드를 호출하는 코드를 테스트하고 있습니다. 그러므로, 나는 위에서 언급 한 구체적인 유형 인이 방법의 응답을 조롱하려고 노력하고있다. – Jmoney38

+0

나는 node.js를 사용하여 자바 스크립트 레벨을 조롱한다. 그래서 나는 당신이하는 것을 시도하지 않았지만'StoredProcedureResponse.Response' 속성에서 필요한 것을 할 수 있을까? –

답변

1

최상위 레벨에서 IDocumentClient 인터페이스가 필요합니까? 당신은 다음 DocumentClient 단지 조롱 IStoredProcedureResponse을 반환하는 모의 서비스를 사용하는 라이브 서비스를 구현할 수,

public interface IDocumentService 
{ 
    Task<IStoredProcedureResponse<T>> ExecuteStoredProcedureAsync<T>(string query, IEnumerable<object> parameters); 
} 
이 경우

, 또는 유사한 하나를하지 않으면, 당신은 서비스 인터페이스를 만들 수 있습니다.

덧붙여 말하자면, IDocumentClient.ExecuteStoredProcedureAsync가 ALSO가 인터페이스에서 상속하는 구체적인 인스턴스를 반환한다는 것이 이상하다는 것을 알았습니다. 간단한 솔루션을 코멘트를 읽어

spr.GetType().InvokeMember("PropertyName", 
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
Type.DefaultBinder, obj, "MyName"); 
+0

당신은 완전히 맞습니다.하지만 IDocumentClient 인터페이스와 직접 대화하고있는 기존 코드를 리핑하지 않으려 고합니다. – Jmoney38

+0

이와 같이 결합 된 경우 상속/새 전략으로 진행하거나 기본 StoredProcedureResponse 인스턴스를 사용하고 표현식 기반 리플렉션을 사용하여 속성 값을 업데이트 할 수 있습니다. – Eric

0

를 사용하여 반사를 만들 수

var response = new StoredProcedureResponse<T>(); 
response.GetType().InvokeMember("responseBody", 
       BindingFlags.Instance | BindingFlags.SetField | BindingFlags.NonPublic, Type.DefaultBinder, response, new object[] {new T()}); 
+0

나는 이것을 시도해 봤지만 실제로 setter가 없기 때문에 reflection은 속성을 설정할 수 없다. 따라서 반환 된 값을 얻기 위해 실제 논리를 수행하는 getter를 재정의한다고 생각합니다. 따라서 나는 리플렉션을 통해 비공개로 설정해야하는 것을 파악하기 위해 클래스를 리버스 엔지니어링하는 방법을 시도하고 있습니다. – Jmoney38

+0

반사경 등을 사용하여 어셈블리를 열었습니까? – Eric

+0

그리고 위의 코드는 공용 설정자를 요구하고 있습니다. BindingFlags.NonPublic도 있습니다. – Eric

0

나는 발견 :

Type type=typeof(StoredProcedureResponse); 
var spr = (StoredProcedureResponse)Activator.CreateInstance(type,true); 

을하고 속성을 설정하고 당신은뿐만 아니라 반사를 사용하여 필요한 다른 어떤이 :

관련 문제