与 my last question on Mocking the HttpContext 相比, 我不得不将正在测试的方法更改为
public override void OnActionExecuting(HttpActionContext actionContext)
{
HttpContext.Current.GetOwinContext().Set("RequestGUID", NewId.NextGuid());
base.OnActionExecuting(actionContext);
}
现在我需要弄清楚如何模拟
HttpContext.Current.GetOwinContext()
,
所以我可以为 Set()
方法编写一个 stub ,或者通常能够测试这一特定行。我怎样才能做到这一点?
最佳答案
我已阅读 this article ,但在你的情况下,我认为做这样的事情会有点矫枉过正..
由于 GetOwinContext()
返回一个接口(interface),您所要做的就是将此调用与方法分开,这样做有两个问题:
- 被测方法(
OnActionExecuting()
属于属性类。 GetOwinContext()
是一个静态方法。
我可以为您提供的最好的 2 个解决方案是:
- 使用 code waving 工具,如 MsFakes、Typemock Isolator 等,而不是基于代理的工具,如 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)));
}
关于c# - 如何使用 Nunit 和 RhinoMocks 模拟 HttpContext.Current.GetOwinContext()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45305608/