Использование .Net WebRequest Factory - PullRequest
7 голосов
/ 17 февраля 2011

Как предполагает Ричард Уиллис в http://blog.salamandersoft.co.uk/index.php/2009/10/how-to-mock-httpwebrequest-when-unit-testing/, я пытаюсь вызвать веб-запрос, имитирующий поведение.

Для этого (я спрашиваю, не здесь ли я что-то путаю), я реализовалIWebRequestСоздать и расширить 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)

Затем я получил эту ошибку: Invalid URI: The hostname could not be parsed.

Но почему?В моем 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;
    }
}

И URL-адрес что-то вроде: mockPrefix://NoMatterUrl

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Так как ошибка «Неверный URI: имя хоста не может быть проанализировано». вы, вероятно, испортили свой Uri "mockPrefix: // NoMatterUrl"

Однажды у меня возникла эта проблема, потому что я забыл добавить "/" между uri домена и параметрами запроса.

Можете ли вы опубликовать, как выглядит ваш "NoMatterUri"?

1 голос
/ 17 февраля 2011

Вам необходимо зарегистрировать префикс с двоеточием (':'); как в:

WebRequest.RegisterPrefix("mockPrefix:", new WebRequestCreateMock());
0 голосов
/ 09 января 2014

Я обнаружил, что в префикс необходимо добавить трейлинг "/". Например, "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 {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...