如何用Nunit和RhinoMocks模拟HttpContext.Current.GetOwinContext()?

问题描述:

相比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()方法,或通常是能够测试这个特定的线路。我怎样才能做到这一点?

我已阅读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