현재 종속성 주입을 사용하지 않는 코드로 작업하고 있으며 WCF 클라이언트를 통해 여러 서비스 호출을합니다.유닛 WCF 클라이언트 테스트
public class MyClass
{
public void Method()
{
try
{
ServiceClient client = new ServiceClient();
client.Operation1();
}
catch(Exception ex)
{
// Handle Exception
}
finally
{
client = null;
}
try
{
ServiceClient client = new ServiceClient();
client.Operation2();
}
catch(Exception ex)
{
// Handle Exception
}
finally
{
client = null;
}
}
}
제 목표는이 코드를 종속성 삽입을 사용하여 단위 테스트 할 수있게 만드는 것입니다. 나의 첫 번째 생각은 서비스 클라이언트의 인스턴스를 클래스 생성자에 전달하는 것이다. 그런 다음 유닛 테스트에서 실제 웹 서비스 요청을하지 않는 테스트 용 모의 클라이언트를 만들 수 있습니다.
public class MyClass
{
IServiceClient client;
public MyClass(IServiceClient client)
{
this.client = client;
}
public void Method()
{
try
{
client.Operation1();
}
catch(Exception ex)
{
// Handle Exception
}
try
{
client.Operation2();
}
catch(Exception ex)
{
// Handle Exception
}
}
}
그러나, 나는이이 질문의 정보를 기반으로, 원래의 행동에 영향을 미치는 방식으로 코드를 변경하는 것을 깨달았다 : Operation1에 대한 호출이 실패 할 경우, 원래의 코드에서 Reuse a client class in WCF after it is faulted
및 클라이언트가 오류 상태가되고 ServiceClient의 새 인스턴스가 만들어지고 Operation2가 계속 호출됩니다. 업데이트 된 코드에서 Operation1에 대한 호출이 실패하면 동일한 클라이언트가 Operation2를 호출하기 위해 다시 사용되지만 클라이언트가 오류 상태 인 경우이 호출이 실패합니다.
종속성 주입 패턴을 유지하면서 클라이언트의 새 인스턴스를 만들 수 있습니까? 문자열을 사용하여 클래스를 인스턴스화하는 데 리플렉션을 사용할 수 있지만 리플렉션이 올바른 방법이 아닌 것 같아요.
public class ServiceClientFactory : IServiceClientFactory
{
public IServiceClient CreateInstance()
{
return new ServiceClient();
}
}
그런 MyClass
에 당신은 단순히 예에게이 요구 될 때마다 얻을 공장을 사용합니다 :
유일한 문제는 클라이언트를 만드는 것입니까? 내 경험에 따르면 생성 된 클래스의 메소드가 항상 가상이 아니기 때문에 생성 된 클라이언트 클래스가 아닌 비즈니스 인터페이스를 기반으로 조롱 된 클라이언트를 반환하려고합니다. 또한 실제 클라이언트는 사용 된 후에 처리해야합니다 (코드에서 보지 못했습니다). 이것은 비즈니스 인터페이스가 일반적으로 지원하지 않는 것입니다. –