As Richard Willis says in http://blog.salamandersoft.co.uk/index.php/2009/10/how-to-mock-httpwebrequest-when-unit-testing/ , I'm trying to trigger a web request by connecting behavior.
For this (I ask me if I messed up something) I implemented IWebRequestCreate and extended WebRequest and WebResponse. (more in the link codes)
But now in my code I had a test that registers ( WebRequest.RegisterPrefix ) prefix:
[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)
Then I got this error: Invalid URI: The hostname could not be parsed.
But why? In my PopulateWithMeterData(Meter meter) I have this call:
WebRequest request = WebRequest.Create(urlListMeteringData); WebResponse ws = request.GetResponse();
Some suggestions? Is an interesting post about the implementation of my class interesting?
EDIT: how @Matthew ask:
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; } }
And Url is something like: mockPrefix://NoMatterUrl
Custodio
source share