Как предлагает Ричард Уиллис в http://blog.salamandersoft.co.uk/index. php / 2009/10 / how-to-mock-httpwebrequest-when-unit-testing / Я пытаюсь вызвать веб-запрос, высмеивая поведение.
Для этого (я спрашиваю, не балуюсь ли я кое-что здесь) Я реализовал IWebRequestCreate и расширил WebRequest и WebResponse. (подробнее в кодах ссылок)
Но теперь в моем коде был тест, который регистрировал ( WebRequest.RegisterPrefix
) префикс:
[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)
Затем я получил эту ошибку: Недействительный URI : Имя хоста не может быть проанализировано.
Но почему? В моем PopulateWithMeterData (метр-метр)
у меня есть такой вызов:
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;
}
}
И URL-адрес выглядит примерно так: mockPrefix: // NoMatterUrl