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

标签 c# unit-testing mocking owin rhino-mocks

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/

相关文章:

ruby-on-rails - RSpec - stub 实例方法

c# - 拆分这些字符串而不破坏拆分参数?

c# - 我如何在 Windows(xp、vista、7)欢迎屏幕或锁定屏幕(如 VNC 或 Dame Ware)中进行交互

C# 设置打开的工作簿

scala - Spark scala mocking spark.implicits 用于单元测试

unit-testing - MVC Core 2.0 单元测试和自动映射器

java - 如何在单元测试中模拟/ stub Java 容器?

c# - 如何从 C# 中的字符串创建基于动态 lambda 的 Linq 表达式?

angularjs - Angular/ Jasmine : Error: No deferred tasks to be flushed

java - Java 8 将支持 CA-sv?