Проблема с настройками Mocking, Unit Testing (NUnit) с помощью HttpHandler - PullRequest
2 голосов
/ 25 августа 2010

Этот пост относится к двум другим постам: здесь и здесь .

Я новичок в модульном тестировании и издевательствах.У меня есть тестовое устройство, которое пытается смоделировать объект HttpContext, включая ответ и запрос.Я думаю, что тестовый код не настроен должным образом, так как после вызова обработчика я сразу получаю сообщение об ошибке.Я получаю сообщение об ошибке:

UnitTests.UADHandlerFixture.Request_Is_Object: System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.

в Abstract.BaseHttpHandler.get_Request () в BaseHttpHandler.cs: ​​строка 21

в Abstract.BaseHttpHandler.get_IsRequestFromUAD () в BaseHttpHandler.cs: строка 23

в Handlers.UADTimeHttpHandler.ProcessRequest (контекст HttpContextBase *): UADTimeHH1015 *

в UnitTests.UADHandlerFixture.Request_Is_Object () в UADHttpHanderTests.cs: строка 47

Код теста:

    [TestFixture]
public class UADHandlerFixture
{
    private Mock<HttpContextBase> _mockHttpContext;
    private Mock<HttpRequestBase> _mockHttpRequest;
    private Mock<HttpResponseBase> _mockHttpResponse;
    private UADTimeHttpHandler _handler;
    private WindsorContainer _container;

    [SetUp]
    public void Init()
    {
        _mockHttpRequest = new Mock<HttpRequestBase>();
        _mockHttpResponse = new Mock<HttpResponseBase>();
        _mockHttpContext = new Mock<HttpContextBase>();
        _container = new WindsorContainer();
        _container.AddComponent<ILogger, FakeLogger>();
        _container.AddComponent<IDataRepository, FakeDataRepository>();

        _mockHttpContext.SetupGet(x => x.Application[0]).Returns(_container);
        _mockHttpContext.SetupGet(x => x.Request).Returns(_mockHttpRequest.Object);
        _mockHttpContext.SetupGet(x => x.Response).Returns(_mockHttpResponse.Object);

        _handler = new UADTimeHttpHandler();
    }

    [Test]
    public void Request_Is_Object()
    {
        _handler.ProcessRequest(_mockHttpContext.Object);
    }
}

Обработчик:

    public class UADTimeHttpHandler : BaseHttpHandler
{
    public override void ProcessRequest(HttpContextBase context)
    {
        if (IsRequestFromUAD)
        {
            Logger.Log("Log stuff");
            DataRepository.Write("DB stuff");
            ReturnResponse(HttpStatusCode.OK, DateTime.Now.ToString());
        }
        else
            ReturnResponse(HttpStatusCode.BadRequest);
    }
}

BaseHandler:

public abstract class BaseHttpHandler : IHttpHandler
{
    private HttpContext _httpContext;
    private ILogger _logger;
    private IDataRepository _dataRepository;
    protected ILogger Logger { get { return _logger; } }
    protected IDataRepository DataRepository { get { return _dataRepository; } }
    protected HttpContext Context { get { return _httpContext; } }
    protected HttpRequest Request { get { return _httpContext.Request; } }
    protected HttpResponse Response { get { return _httpContext.Response; } }
    protected bool IsRequestFromUAD { get { return Request.UserAgent == null ? false : Request.UserAgent.Equals("UAD"); } }
    public virtual bool IsReusable { get { return false; } }

    public void ProcessRequest(HttpContext context)
    {
        WindsorContainer container = (WindsorContainer)context.Application[0];
        _logger = container.Resolve<ILogger>();
        _dataRepository = container.Resolve<IDataRepository>();

        _httpContext = context;
        ProcessRequest(new HttpContextWrapper(context));
    }

    protected virtual void ReturnResponse(HttpStatusCode httpStatus)
    {
        Response.StatusCode = (int)httpStatus;
    }

    protected virtual void ReturnResponse(HttpStatusCode httpStatus, string response)
    {
        Response.StatusCode = (int)httpStatus;
        Response.Write(response);
    }

    protected virtual string GetInputStream()
    {
        using (var reader = new StreamReader(Request.InputStream))
        {
            return reader.ReadToEnd();
        }
    }

    public abstract void ProcessRequest(HttpContextBase context);
}

1 Ответ

1 голос
/ 25 августа 2010

Я неправильно прочитал ваш пост.Не обращайте внимания на этот ответ.

Мне любопытно, когда вы вызываете Dispose () в вашем хранилище.

...