我正在尝试模拟一个API控制器方法的HttpContextWrapper,该方法应该返回UserHostAddress。我对执行没有控制权。我应该只对我所得到的代码进行单元测试。
我已经在StackOverflow上学习了一些例子,虽然我已经接近于实现我所需要的,但我无法克服这个例外:
Moq.MockException :严格的模拟行为导致HttpContextBase.ApplicationInstance调用失败。模拟上的所有调用都必须有相应的设置。
以下是我的单元测试方法:
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");
}发布于 2015-09-04 18:58:34
在CreateRequest方法中,您要在baseContext模拟中引用ApplicationInstance.Context。但是,在此属性上没有设置:
var baseContextWrapper = new Mock(baseContext.Object.ApplicationInstance.Context);
在模拟baseContext上设置上下文
https://stackoverflow.com/questions/32401701
复制相似问题