2011-02-17 12 views
7

रिचर्ड विलिस http://blog.salamandersoft.co.uk/index.php/2009/10/how-to-mock-httpwebrequest-when-unit-testing/ में सुझाव देते हैं कि मैं व्यवहार का मज़ाक उड़ाते हुए एक वेब अनुरोध को कॉल करने का प्रयास कर रहा हूं।.Net WebRequest फैक्टरी का उपयोग

इसके लिए (मैं मुझसे पूछ रहा हूं कि मैं यहां कुछ गड़बड़ कर रहा हूं) मैंने एक IWebRequestCreate लागू किया और एक वेबरवेस्ट और एक वेब रेस्पॉन्स बढ़ाया। (अधिक लिंक कोड में विवरण)

लेकिन अब मेरी कोड में मैं एक परीक्षण है कि रजिस्टर (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(); 

कुछ सुझाव? क्या मेरी कक्षा कार्यान्वयन दिलचस्प है?


संपादित करें: @Matthew रूप से पूछते हैं:

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; 
    } 
} 

और यूआरएल कुछ की तरह है: mockPrefix://NoMatterUrl

+0

मैं आपके कोड को और अधिक मांस दूंगा, और यूआरएल का एक उदाहरण दें जिसका उपयोग आप अपना अनुरोध बनाने के लिए कर रहे हैं। –

+0

@ कस्टोडियो मैं वीएलसी प्लगइन वीडियो लक्ष्य स्रोत के लिए HTTPHanlder को पास करने के लिए आरटीएमपी लिंक का उपयोग करना चाहता हूं। क्या आप मेरी मदद कर सकते हैं कि वीएलसी प्लगइन प्लेयर में लाइव स्ट्रीम पढ़ने में अपने कोड का उपयोग कैसे करें [मेरा प्रश्न यहां] (http://stackoverflow.com/questions/21862260/http-handler-returns- लक्ष्य- स्रोत-for-vlc-plugin -प्लेयर) – ZahidKakar

उत्तर

3

त्रुटि के बाद से "अवैध यूआरआई: होस्टनाम को पार्स नहीं किया जा सका।" आप शायद अपने उरी "मॉकप्रिक्स: // नोमैटर यूआरएल" को खराब कर रहे हैं

मुझे यह समस्या एक बार थी क्योंकि मैं डोमेन यूरी और अनुरोध पैरामीटर के बीच "/" जोड़ना भूल गया था।

क्या आप वाकई पोस्ट कर सकते हैं कि आपका "नोमैटर यूरी" कैसा दिखता है?

+0

बिल्कुल सही! मैं यूआरएल को गड़बड़ कर रहा था, मुझे मिल गया था: 'mockPrefix: // NoMatterUrlADM_ROND और datainicio = 2000101000000 और datafim = 2000102000000'। इसलिए मैंने' 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 {} 
} 
संबंधित मुद्दे