Насмешка WebResponse от WebRequest

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
34
задан John Saunders 19 December 2013 в 17:46
поделиться

3 ответа

Я нашел этот вопрос, пытаясь сделать то же самое. Ответа нигде найти не удалось, но после небольшого поиска выяснилось, что .Net Framework имеет встроенную поддержку для этого.

Вы можете зарегистрировать фабричный объект с помощью WebRequest.RegisterPrefix который WebRequest.Create будет вызывать при использовании этого префикса (или URL-адреса). Объект фабрики должен реализовывать IWebRequestCreate , который имеет единственный метод Create , который возвращает WebRequest . Здесь вы можете вернуть свой макет WebRequest .

Я поместил образец кода на http://blog.salamandersoft.co.uk/index.php/2009/10/how-to-mock-httpwebrequest-when-unit-testing/

59
ответ дан 27 November 2019 в 16:27
поделиться

Вы не можете. Лучшая вещь сделать обернуть его в объект прокси, и затем дразнить это. С другой стороны, необходимо было бы использовать ложную платформу, которая может прервать типы, которые нельзя дразнить, как TypeMock. Но Вы говорите о маркерах, там. Лучше сделать немного обертывания.

<час>

, По-видимому, Вы можете с небольшой дополнительной работой. Проверьте самый высокий проголосовавший ответ здесь.

2
ответ дан 27 November 2019 в 16:27
поделиться

Это еще не идеальное решение, оно работало на меня прежде и заслуживает дополнительной заботы о простоте:

HTTPSimulator

Также typemock пример зарегистрировал в typemock форумах:

using System;
using System.IO;
using System.Net;
using NUnit.Framework;
using TypeMock;

namespace MockHttpWebRequest
{
  public class LibraryClass
  {
    public string GetGoogleHomePage()
    {
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();
      using (StreamReader reader = new StreamReader(response.GetResponseStream()))
      {
        return reader.ReadToEnd();
      }
    }
  }

  [TestFixture]
  [VerifyMocks]
  public class UnitTests
  {
    private Stream responseStream = null;
    private const string ExpectedResponseContent = "Content from mocked response.";

    [SetUp]
    public void SetUp()
    {
      System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
      byte[] contentAsBytes = encoding.GetBytes(ExpectedResponseContent);
      this.responseStream = new MemoryStream();
      this.responseStream.Write(contentAsBytes, 0, contentAsBytes.Length);
      this.responseStream.Position = 0;
    }

    [TearDown]
    public void TearDown()
    {
      if (responseStream != null)
      {
        responseStream.Dispose();
        responseStream = null;
      }
    }

    [Test(Description = "Mocks a web request using natural mocks.")]
    public void NaturalMocks()
    {
      HttpWebRequest mockRequest = RecorderManager.CreateMockedObject<HttpWebRequest>(Constructor.Mocked);
      HttpWebResponse mockResponse = RecorderManager.CreateMockedObject<HttpWebResponse>(Constructor.Mocked);
      using (RecordExpectations recorder = RecorderManager.StartRecording())
      {
        WebRequest.Create("http://www.google.com");
        recorder.CheckArguments();
        recorder.Return(mockRequest);

        mockRequest.GetResponse();
        recorder.Return(mockResponse);

        mockResponse.GetResponseStream();
        recorder.Return(this.responseStream);
      }

      LibraryClass testObject = new LibraryClass();
      string result = testObject.GetGoogleHomePage();
      Assert.AreEqual(ExpectedResponseContent, result);
    }

    [Test(Description = "Mocks a web request using reflective mocks.")]
    public void ReflectiveMocks()
    {
      Mock<HttpWebRequest> mockRequest = MockManager.Mock<HttpWebRequest>(Constructor.Mocked);
      MockObject<HttpWebResponse> mockResponse = MockManager.MockObject<HttpWebResponse>(Constructor.Mocked);
      mockResponse.ExpectAndReturn("GetResponseStream", this.responseStream);
      mockRequest.ExpectAndReturn("GetResponse", mockResponse.Object);

      LibraryClass testObject = new LibraryClass();
      string result = testObject.GetGoogleHomePage();
      Assert.AreEqual(ExpectedResponseContent, result);
    }
  }
}
0
ответ дан dr. evil 27 November 2019 в 16:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: