Использование .Net WebRequest Factory

Как предлагает Ричард Уиллис в 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

7
задан Custodio 17 February 2011 в 20:07
поделиться