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

Eed*_*doh 2 c# nunit unit-testing rhino-mocks mocking

我在 (WebApi) 项目上使用NUnitRhinoMocks进行单元测试。

有一种方法我正在尝试为其编写测试,它应该向 HttpContext.Current.Items 添加一个项目。

public override void OnActionExecuting(HttpActionContext actionContext)
{
    HttpContext.Current.Items.Add("RequestGUID", Guid.NewGuid());
    base.OnActionExecuting(actionContext);
}
Run Code Online (Sandbox Code Playgroud)

我不知道HttpContext.Current.Items从测试方法中运行时如何使该方法可用。我怎样才能做到这一点?

另外,我如何检查项目是否已添加(我可以/应该使用什么样的断言)

Old*_*Fox 5

你不需要重构你的代码\使用 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);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可以将此测试拆分为 2:

  1. 验证 RequestGUID 是否使用 GUID 填充
  2. 验证 GUID 不是 Guid.Empty