2011-02-17 5 views
7

Richard Willis가 http://blog.salamandersoft.co.uk/index.php/2009/10/how-to-mock-httpwebrequest-when-unit-testing/에 제안한대로 동작을 moking하는 중입니다..Net WebRequest Factory 사용

(나는 뭔가를 망쳐 놓는 지 물어 본다.) IWebRequestCreate를 구현하고 WebRequest와 WebResponse를 확장했다. (링크 코드에 대한 자세한 내용)

하지만 지금 내 코드에서 나는 (WebRequest.RegisterPrefix) 접두사 레지스터 테스트했다 : Invalid URI: The hostname could not be parsed.

그런데 왜 :

[Test] 
public void Test() { 
    var some = File.ReadAllBytes(@"TestData\WebService\admrond_13jan2011_14jan2011.xml"); 
    WebRequest.RegisterPrefix("mockPrefix", new WebRequestCreateMock()); 
    WebRequestFake request = WebRequestCreateMock.CreateRequestFake(some); 

    _remoteRepository.PopulateWithMeterData(_meter); 
    ... (error in line before) 

그럼,이 오류를 가지고 있습니까? 내 PopulateWithMeterData(Meter meter)에서 나는이 전화를 가지고있다 :

 WebRequest request = WebRequest.Create(urlListMeteringData); 
    WebResponse ws = request.GetResponse(); 

약간의 제안? 흥미로운 게시물 구현은 무엇입니까?


편집 :

public class WebRequestCreateMock : IWebRequestCreate { 

    static WebRequest _nextRequest; 
    static readonly object LockObject = new object(); 

    static public WebRequest NextRequest { 
     get { return _nextRequest; } 
     set { 
      lock (LockObject) { 
       _nextRequest = value; 
      } 
     } 
    } 

    public WebRequest Create(Uri uri) { 
     return _nextRequest; 
    } 

    public static WebRequestFake CreateRequestFake(byte[] xmlStream) { 
     WebRequestFake webRequestFake = new WebRequestFake(xmlStream); 
     NextRequest = webRequestFake; 
     return webRequestFake; 
    } 

} 

public class WebRequestFake : WebRequest { 
    MemoryStream requestStream = new MemoryStream(); 
    MemoryStream responseStream; 

    public override string Method { get; set; } 
    public override string ContentType { get; set; } 
    public override long ContentLength { get; set; } 

    public WebRequestFake(byte[] response) { 
     responseStream = new MemoryStream(response); 
    } 

    public override Stream GetRequestStream() { 
     return requestStream; 
    } 

    public override WebResponse GetResponse() { 
     return new WebReponseFake(responseStream); 
    } 
} 

public class WebReponseFake : WebResponse { 

    private readonly Stream _responseStream; 

    public WebReponseFake(Stream responseStream) { 
     _responseStream = responseStream; 
    } 

    public override Stream GetResponseStream() { 
     return _responseStream; 
    } 
} 

을하고 URL 뭔가 같다 : 질문 @Matthew과 같이 콜론 (':')으로 접두사를 등록해야 mockPrefix://NoMatterUrl

+0

코드를 더 자세히 작성하고 요청을 작성하는 데 사용하는 URL의 예를 제공하십시오. –

+0

@Custodio vlc 플러그인 비디오 대상 소스를 HTTPHanlder에 전달하려면 rtmp 링크를 사용하고 싶습니다. vlc 플러그인 플레이어에 라이브 스트림을 읽는 데 코드를 사용하는 방법을 알려주십시오. [내 질문은 여기] (http://stackoverflow.com/questions/21862260/http-handler-returns-target-source-for-vlc-plugin -player) – ZahidKakar

답변

3

"잘못된 URI : 호스트 이름을 파싱하지 못했습니다." 당신은 당신의 Uri를 망칠 것입니다. "mockPrefix : // NoMatterUrl"

도메인 uri와 요청 매개 변수 사이에 "/"를 추가하는 것을 잊어 버렸기 때문에 한 번이 문제가있었습니다.

"NoMatterUri"의 모양을 정확히 게시 할 수 있습니까?

+0

완벽 해요!'mockPrefix : // NoMatterUrlADM_ROND & datainicio = 20090101000000 & datafim = 20090102000000'을 디버깅 할 때 URL을 엉망으로 만들고 있습니다. 그래서 'NoMatterUrl' 다음에 "/"를 넣으면 모든 것이 잘됩니다! – Custodio

1

; 예를 들면 다음과 같습니다.

WebRequest.RegisterPrefix("mockPrefix:", new WebRequestCreateMock()); 
+0

좋은 소식! 콜론도 시도해 봤어. 작동하지 않습니다 : ( – Custodio

0

나는 접두어에 "/"를 추가해야합니다. 예를 들어, "test://localhost/":

[TestClass] 
public class WebRequestTests 
{ 
    [TestMethod] 
    public void TestWebRequestCreate() 
    { 
     const string uriString = "test://localhost/foo/bar.baz?a=b&c=d"; 
     var webRequest = new MockWebRequestCreateAssertUrl(uriString); 
     Assert.IsTrue(WebRequest.RegisterPrefix("test://localhost/", webRequest), 
         "Failed to register prefix"); 
     Assert.IsNotNull(WebRequest.Create(uriString)); 
    } 

    public class MockWebRequestCreateAssertUrl : IWebRequestCreate 
    { 
     private readonly Uri _expectedUri; 

     public MockWebRequestCreateAssertUrl(string uriString) 
     { 
      _expectedUri = new Uri(uriString); 
     } 

     public WebRequest Create(Uri uri) 
     { 
      Assert.AreEqual(_expectedUri, uri, "uri parameter is wrong"); 
      return new MockWebRequestAssertUrl(); 
     } 
    } 

    public class MockWebRequestAssertUrl : WebRequest {} 
}