MockingHttpRequestMessage/HttpContextWrapper

Я пытаюсь выполнить модульное тестирование следующего метода с помощью Moq, но у меня возникают проблемы с доступностью манипулирования некоторыми свойствами этих классов и даже с их макетом в этом отношении.

    public string GetClientIpAddress(HttpRequestMessage request)
    {
        if (request.Properties.ContainsKey("MS_HttpContext"))
            return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;

        if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
            return ((RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]).Address;

        return "IP Address Unavailable";
    }

Для проверки я создал экземпляр HttpRequestMessage, который передаю в качестве параметра. Затем я добавляю макет HttpRequest и HttpContext, например...

        // Assign 
        var mockHttpRequestBase = new Mock<HttpRequest>();
        mockHttpRequestBase.Setup(m => m.UserHostAddress).Returns("127.0.0.1");

        var mockHttpContext = new Mock<HttpContext>();
        mockHttpContext.Setup(m => m.Request).Returns(mockHttpRequestBase.Object);

        var httpRequestMessage = new HttpRequestMessage();
        httpRequestMessage.Properties.Add(new KeyValuePair<string, object>("MS_HttpContext", mockHttpRequestBase.Object));

        var apiCachedController = new ApiCachedController();

        // Act
        var address = apiCachedController.GetClientIpAddress(httpRequestMessage);

        // Assert
        Assert.AreEqual(address, "127.0.0.1");

РЕДАКТИРОВАТЬ: Извините за то, что я не уточнил конкретную проблему (проблемы), с которыми я столкнулся. HttpRequest не может быть имитирован. Я получаю NotSupportedException, что «тип для имитации должен быть интерфейсом, абстрактным или незапечатанным классом». Я пытался использовать HttpRequestBase и HttpContextWrapper вместо HttpRequest и HttpContext соответственно, но получаю InvalidCastException с сообщением: «Невозможно привести объект типа Castle.Proxies.HttpRequestBaseProxy к типу System.Web.HttpContextWrapper».


person cdalto    schedule 07.10.2015    source источник
comment
А какая у тебя проблема?   -  person PatrickSteele    schedule 08.10.2015
comment
Я извиняюсь за то, что не ясно выразился... Для начала, HttpRequest не может быть издевательским. Я получаю исключение NotSupportedException, тип которого для имитации должен быть интерфейсом, абстрактным или незапечатанным классом. Я пытался использовать HttpRequestBase и HttpContextWrapper вместо HttpRequest и HttpContext соответственно, но получаю сообщение InvalidCastException: «Невозможно преобразовать объект типа «Castle.Proxies.HttpRequestBaseProxy» в тип «System.Web.HttpContextWrapper».   -  person cdalto    schedule 12.10.2015


Ответы (1)


Moq не может создать объект Mock из самого класса, вам нужно создать (и использовать) интерфейс в своем коде, а затем создать из него Mock.

person LWood    schedule 22.10.2015