我试图模拟一个应该返回UserHostAddress的API控制器方法的HttpContextWrapper。我无法控制实施。我只应该对我给出的代码进行单元测试。
我已经在StackOverflow上已经有了一些例子,虽然我已经接近实现我的需求,但我无法超越这个例外:
Moq.MockException:HttpContextBase.ApplicationInstance调用因模拟行为Strict而失败。 模拟上的所有调用都必须有相应的设置。
以下是我的单元测试方法:
private static HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method)
{
var request = new HttpRequestMessage();
var baseRequest = new Mock<HttpRequestBase>(MockBehavior.Strict);
var baseContext = new Mock<HttpContextBase>(MockBehavior.Strict);
baseRequest.Setup(br => br.UserHostAddress).Returns("127.0.0.1");
baseContext.Setup(bc => bc.Request).Returns(baseRequest.Object);
var baseContextWrapper = new Mock<HttpContextWrapper>(baseContext.Object.ApplicationInstance.Context);
request.RequestUri = new Uri(url);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
request.Properties.Add("MS_HttpContext", baseContextWrapper.Object);
request.Method = method;
return request;
}
[Test]
public void IsClientIpAddressReturned()
{
// Assign
var request = CreateRequest("http://myserver/api/CustomerController", "application/json", HttpMethod.Get);
var apiCachedController = new ApiCachedController();
// Act
RequestManager.RegisterRequestWithThread();
var address = apiCachedController.GetClientIpAddress(request);
// Assert
Assert.AreEqual(address, "127.0.0.1");
}
答案 0 :(得分:0)
在方法CreateRequest
中,您引用了ApplicationInstance.Context
模拟中的baseContext
。但是,您没有此属性的安装程序:
var baseContextWrapper = new Mock(baseContext.Object.ApplicationInstance.Context);
在Mock baseContext上设置Context