2017-07-21 59 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世界裏呆了兩年多了......所以我認爲你會發佈一個新問題會更好......我看到了另一個答案是完全錯誤,所以我不得不添加一個答案....否則,我會投票並繼續...... –

相關問題