如何使用NUnit和Rhino Mocks模拟HttpContext.Current.Items

我正在使用NUnitRhinoMocks进行(WebApi)项目的unit testing。

我正在尝试编写一个测试方法,它应该向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:

  1. validationRequestGUID是否正在使用GUID填充
  2. validationGUID不是Guid.Empty