2017-01-11 3 views
1

내 시나리오는 - 두 가지 핵심 메서드 : CreateRequest 및 GetResponse가있는 인터페이스 (IRestSupport) 뒤에 구체적인 클래스 (RestSupport)가 있습니다. 이 클래스는 JSON을 통해 웹 엔드 포인트와 통신 할 수 있도록 설계되었습니다. 이 클래스는 더 높은 수준의 비즈니스 로직을 가진 다른 클래스에 의해 호출되어 보내야 할 정확한 JSON을 제공합니다.유닛 테스트 WebRequest.CreateHttp 내 라이브러리 내

테스트하는 동안 끝점을 호출하지 않도록 이러한 두 가지 방법을 단위 테스트 할 수 있어야합니다. CreateRequest는 Headers 컬렉션에 정보를 추가해야하기 때문에 HttpWebRequest를 사용합니다. 이보다 더 많은 코드가 있지만 아래에 예제가 있습니다.

요청 작성을 제어 할 수 있도록 IWebRequestCreate를 사용하는 웹에서 많은 예제를 볼 수 있습니다. 내가 가지고있는 문제는 HttpWebRequest를 사용할 때 제대로 작동하지 않는 것처럼 보일 수 있다는 것입니다. IWebRequestCreate의 Create 메서드는 WebRequest 개체를 반환 할 것으로 예상합니다. 웹 예제의 단점은 HttpWebRequest를 사용하지 않는다는 것입니다. 나는 HttpWebRequest로부터 클래스를 파생시킬 수 없다. 그것은 정말로 내 문제의 핵심이다.

가짜에 액세스 할 수는 없지만 Moq을 사용할 수 있습니다. 내 목표는 피할 수있는 경우 라이브러리 코드를 수정하지 않는 것입니다.

답변

0

메모리의 단위 테스트에 대해 이야기하고 있다고 가정 해 보겠습니다. 가장 간단한 방법은 인터페이스를 구현하는 다른 클래스에서이 두 줄을 "숨기는"것입니다. 이제 인터페이스를 조롱 할 수 있습니다. 나에게 이상한 것은 2 줄 밖에 없다는 것입니다. 수업 시간에 시험 할 수없는 것들이 많이 있습니다. 필자가 제안하고자하는 것은 테스트하려는 모든 논리를 테스트 할 가치가없는 "인프라"세부 사항으로 분리하는 것입니다.

0

나는 어제 정확히 똑같은 문제를 겪었습니다.

WebRequest을 포함하는 클래스는 생성자에서 IWebRequestCreate을 사용합니다. 응용 프로그램에서

class MyClass 
{ 
    IWebRequestCreate _web; 
    public MyClass(IWebRequestCreate web) 
    { 
     _web = web; 
    } 
    public void Download(string url) 
    { 
     var request = _web.Create(url); 

    } 
} 

, 나는 IoC 컨테이너 내 클래스를 등록 : 내 테스트에서

class MyWebRequest : IWebRequestCreate 
{ 
    public WebRequest Create(Uri uri) 
    { 
     return WebRequest.Create(uri); 
    } 
} 

나는 기능과 모의을 만들어 덮어 필요

void TestSetupMocks() 
{ 
    var request = new TestWebRequest(); 
    Mock<IWebRequestCreate> _webClientFactory; 
    _webClientFactory.Setup(x => x.Create(uri)).Returns(request); 
} 

class TestWebRequest : WebRequest 
{ 
    // Implement abstract functions 
} 
관련 문제