단위 테스트 WCF 서비스를 돕기 위해 몇 가지 코드를 작성하려고합니다. 이러한 서비스는 프록시 인스턴스를 생성 한 facade 클래스를 통해 액세스 한 다음 프록시 메소드를 호출하고 결과를 반환합니다. 각 프록시 메소드에 대해. 나는 현재 생성 코드를 실제 서비스 나 가짜 코드를 생성하는 것으로 대체 할 수 있기를 바란다.일반 제약 조건과 상속
나는 그것을 작동시키지 못했습니다. 나는 그것을 아래로 삶은 다음
using System.ServiceModel;
namespace ExpressionTrees
{
public interface IMyContract
{
void Method();
}
public class MyClient : ClientBase<IMyContract>, IMyContract
{
public MyClient()
{
}
public MyClient(string endpointConfigurationName)
: base(endpointConfigurationName)
{
}
public void Method()
{
Channel.Method();
}
}
public class Test
{
public TClient MakeClient<TClient>()
where TClient : ClientBase<IMyContract>, IMyContract, new()
{
return new MyClient("config");
// Error:
// Cannot convert expression of type 'ExpressionTrees.ServiceClient' to return type 'TClient'
}
}
}
이유는 MyClient
클래스가 나는 TClient
를 반환하는 것을 의미하는 방법에서 MyClient
인스턴스를 반환 할 수없는, ClientBase<IMyContract>
에서 유래와 IMyContract
구현에도 불구하고 있다는 점이다? TClient
은 같은 것을 의미한다고 생각했던 유형 제한을 지정합니다.
public void CallClient<TClient>()
where TClient : ClientBase<IMyContract>, IMyContract
{
TClient client = null;
bool success = false;
try
{
client = MakeClient<TClient>();
client.Method();
client.Close();
success = true;
}
finally
{
if (!success && client != null)
{
client.Abort();
}
}
}
하지만 그 대신 항상 MakeClient<TClient>
를 호출, 내가 단위 테스트는 모의 객체를 주입 가질 수 있기를 원 :
내 목표는 다음과 같이 코드를 호출하는 것이 었습니다. 위의 코드는 모두 ClientBase<IMyContract>
, IMyContract
에 의존하기 때문에이 제약 조건을 충족시키는 일반 클래스를 "합성"하려고 시도한 것으로 보입니다.
돌이켜 볼 때 이는 의미가 없습니다. 예를 들어 ClientBase<IMyContract>
은 Channel
개체가 구성되어 Close
메서드를 위임 할 수있는 방식으로 인스턴스화 될 것으로 예상됩니다.
실제 코드와 위조 된 서비스에 대해 동일한 코드가 실행될 때 나는 펑 소리를 냈습니다. 이제 IMyService
을 주입하고 주입 된 속성이 null인지 여부에 따라 IMyService.Method
또는 client.Method
을 호출합니다.
나는 왜이 질문이 downvotes를 끄는 지 상상할 수 없다. 나는 downvoters 중 하나가 그 질문을 향상시킬 수 있도록 말해줬으면 좋겠다. –