2017-07-21 57 views
1

我在(WebApi)项目上使用NUnitRhinoMocks进行单元测试。如何使用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可用的方法,从测试方法中跑的时候。我怎样才能做到这一点?

另外,我怎么能检查,如果该项目已被添加(可以/我应该使用什么样的断言)

+0

您是否能够重构该代码?它与'HttpContext'紧密耦合,这使得测试非常困难,应该避免。 – Nkosi

+0

是的,我。你有什么建议?我只是简单地将HttpContext包装在一个虚拟/空的类中,还是其他的东西? – Eedoh

+0

什么版本的asp.net是这样的。 MVC5 ?, WEB API 2?需要更多的上下文以了解该方法从哪里来的 – Nkosi

回答

2

你并不需要在所有的重构代码\使用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. 验证RequestGUID被填充了一个GUID
  2. 验证该GUID不是Guid.Empty
+0

这工作像一个魅力。根本不需要嘲笑。大。谢谢! – Eedoh

+0

这应该可能是一个单独的问题。但我怎么会去嘲笑HttpContext.Current.GetOwinContext()。Request.Context :)? – Eedoh

+0

@Eedoh只是说实话我已经不再在.net世界里呆了两年多了......所以我认为你会发布一个新问题会更好......我看到了另一个答案是完全错误,所以我不得不添加一个答案....否则,我会投票并继续...... –

相关问题