Я пытаюсь выполнить модульное тестирование следующего метода с помощью 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».