如何使用NUnit和Rhino Mock模拟HttpContext.Current.Items
问题描述:
我在(WebApi)项目上使用NUnit
和RhinoMocks
进行单元测试。如何使用NUnit和Rhino Mock模拟HttpContext.Current.Items
有一个方法,我试图编写测试,这应该是添加一个项目到HttpContext.Current.Items。
public override void OnActionExecuting(HttpActionContext actionContext)
{
HttpContext.Current.Items.Add("RequestGUID", Guid.NewGuid());
base.OnActionExecuting(actionContext);
}
我不知道我怎样才能使HttpContext.Current.Items
可用的方法,从测试方法中跑的时候。我怎样才能做到这一点?
另外,我怎么能检查,如果该项目已被添加(可以/我应该使用什么样的断言)
答
你并不需要在所有的重构代码\使用RhinoMocks
测试它。
你的UT应类似于下面的例子:
[Test]
public void New_GUID_should_be_added_when_OnActionExecuting_is_executing()
{
//arrange section:
const string REQUEST_GUID_FIELD_NAME = "RequestGUID";
var httpContext = new HttpContext(
new HttpRequest("", "http://google.com", ""),
new HttpResponse(new StringWriter())
);
HttpContext.Current = httpContext;
//act:
target.OnActionExecuting(new HttpActionContext());
//assert section:
Assert.IsTrue(HttpContext.Current.Items.Contains(REQUEST_GUID_FIELD_NAME));
var g = HttpContext.Current.Items[REQUEST_GUID_FIELD_NAME] as Guid?;
if (g == null)
{
Assert.Fail(REQUEST_GUID_FIELD_NAME +
" is not a GUID, it is :: {0}",
HttpContext.Current.Items[REQUEST_GUID_FIELD_NAME]);
}
Assert.AreNotEqual(Guid.Empty, g.Value);
}
顺便说一句,你可以在此测试拆分为2:
- 验证RequestGUID被填充了一个GUID
- 验证该GUID不是
Guid.Empty
您是否能够重构该代码?它与'HttpContext'紧密耦合,这使得测试非常困难,应该避免。 – Nkosi
是的,我。你有什么建议?我只是简单地将HttpContext包装在一个虚拟/空的类中,还是其他的东西? – Eedoh
什么版本的asp.net是这样的。 MVC5 ?, WEB API 2?需要更多的上下文以了解该方法从哪里来的 – Nkosi