2017-07-25 81 views
2

相比my last question on Mocking the HttpContext,我不得不改變方法的測試,以如何用Nunit和RhinoMocks模擬HttpContext.Current.GetOwinContext()?

public override void OnActionExecuting(HttpActionContext actionContext) 
{ 
    HttpContext.Current.GetOwinContext().Set("RequestGUID", NewId.NextGuid()); 
    base.OnActionExecuting(actionContext); 
} 

現在我需要弄清楚如何嘲笑 HttpContext.Current.GetOwinContext(), 所以,我可以寫一個短的Set()方法,或通常是能夠測試這個特定的線路。我怎樣才能做到這一點?

回答

2

我已閱讀this article,但在你的情況,我認爲做這樣的事是矯枉過正..

由於GetOwinContext()返回一個接口的所有你所要做的就是這一呼籲從方法分離,做這樣的事有2個問題:

  1. 下試驗的方法(OnActionExecuting()由一個屬性類資
  2. GetOwinContext()是一個靜態方法
。個

最好的2種解決方案,我可以爲您提供的是:像MsFakes,Typemock隔離器和等

  1. 使用代碼揮舞工具,而不是像RhinoMocks基於代理的工具。
  2. 提取GetOwinContext()到虛擬方法,然後使用PartialMock技術(這種技術通常是在使用抽象類):

假設MyCustonAttributte是你的屬性:

public class MyCustonAttributte : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     GetOwinContext().Set("RequestGUID", Guid.NewGuid()); 
     base.OnActionExecuting(actionContext); 
    } 

    public virtual IOwinContext GetOwinContext() 
    { 
     return HttpContext.Current.GetOwinContext(); 
    } 
} 

那麼你的UT將是:

[Test] 
public void New_GUID_should_be_added_when_OnActionExecuting_is_executing() 
{ 
    //arrange section: 
    const string REQUEST_GUID_FIELD_NAME = "RequestGUID"; 
    var owinContext = MockRepository.GenerateStub<IOwinContext>(); 

    var target = MockRepository.GeneratePartialMock<MyCustonAttributte>(); 

    target.Stub(x => x.GetOwinContext()) 
     .Return(owinContext); 

    //act: 
    target.OnActionExecuting(new HttpActionContext()); 

    //assert section: 
    owinContext.AssertWasCalled(x => x.Set(Arg<string>.Is.Equal(REQUEST_GUID_FIELD_NAME), 
     Arg<Guid>.Is.NotEqual(Guid.Empty))); 
} 
+0

工程就像一個魅力。無論如何,GUID被添加到集合中是我唯一想要測試的東西......非常感謝。 – Eedoh