如何用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个问题:
- 下试验的方法(
OnActionExecuting()
由一个属性类资 -
GetOwinContext()
是一个静态方法
最好的2种解决方案,我可以为您提供的是:像MsFakes,Typemock隔离器和等
- 使用代码挥舞工具,而不是像RhinoMocks基于代理的工具。
- 提取
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)));
}
工程就像一个魅力。无论如何,GUID被添加到集合中是我唯一想要测试的东西......非常感谢。 – Eedoh