gpt4 book ai didi

c# - 如何使用 Nunit 和 RhinoMocks 模拟 HttpContext.Current.GetOwinContext()?

转载 作者:行者123 更新时间:2023-11-30 15:17:58 36 4
gpt4 key购买 nike

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),您所要做的就是将此调用与方法分开,这样做有两个问题:

  1. 被测方法(OnActionExecuting() 属于属性类。
  2. GetOwinContext() 是一个静态方法。

我可以为您提供的最好的 2 个解决方案是:

  1. 使用 code waving 工具,如 MsFakes、Typemock Isolator 等,而不是基于代理的工具,如 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)));
}

关于c# - 如何使用 Nunit 和 RhinoMocks 模拟 HttpContext.Current.GetOwinContext()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45305608/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com