c# - 使用 Moq 在 NUnit 中模拟 HttpContext.GetGlobalResourceObject

标签 c# nunit moq httpcontext

我正在尝试编写一个单元测试来测试使用 HttpContext.GetGlobalResourceObject() 的方法,我想使用 Moq 模拟它。

假设我们正在测试这个方法:

public List<DctmGridColumn> GetDctmColumnsMandatory()
{
   List<DctmGridColumn> metadataFields = new List<DctmGridColumn>
        {
            new DctmGridColumn(HttpContext.GetGlobalResourceObject("SharePoint.Service", "DctmGridColumn_DispName_r_object_id").ToString()),
            new DctmGridColumn(HttpContext.GetGlobalResourceObject("SharePoint.Service", "DctmGridColumn_DispName_object_name").ToString()),
            new DctmGridColumn(HttpContext.GetGlobalResourceObject("SharePoint.Service", "DctmGridColumn_DispName_r_modify_date").ToString()),
            new DctmGridColumn(HttpContext.GetGlobalResourceObject("SharePoint.Service", "DctmGridColumn_DispName_r_version_label").ToString())
        };

        return metadataFields;
}

这是我的测试:

[Test]
public void TestGetDctmColumnsMandatory_IsNotNull()
{
    var columns = _viewDefinitionOperations.GetDctmColumnsMandatory();
    Assert.IsNotNull(columns);
}

如何模拟 HttpContext?我整天都在谷歌搜索,我发现了一两个使用模拟框架的例子,其余的创建了他们自己的模拟。我尝试使用在 Setting HttpContext.Current.Session in a unit test 中标记为答案的方法,但随后我将不得不“用 HttpContextFactory.Current 替换对 HttpContext.Current 的任何调用并访问相同的方法。”我对那个解决方案不太满意。

我对模拟相当陌生,但我想必须有更简单的方法吗? 我只想将我对 HttpContext 的所有调用从单元测试定向到我的模拟类。有那么多要求吗? :)

最佳答案

  1. 让您的被测类依赖于 HttpContextBase (这是抽象)。

  2. 在正常执行中使用 HttpContextWrapper(派生自 HttpContextBase) 来包装 HttpContext 并将其提供给您的 类。

  3. 然后在您的单元测试中,您可以传入模拟 HttpContextBase 谁的 GetGlobalResourceObject 由您控制。

它很简单,但需要您重新考虑如何设计应用程序的各个部分。这种控制反转对于编写易于单元测试的代码至关重要。使用 IoC 容器可能会有所帮助。

关于c# - 使用 Moq 在 NUnit 中模拟 HttpContext.GetGlobalResourceObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254470/

相关文章:

c# - Moq 引发事件错误 - 参数计数不匹配

c# - Moq Mock.Of<Obj> 与 new Obj();

c# - Moq:从通用接口(interface)继承的模拟接口(interface)

c# - 将相对日期时间字符串转换为 DateTime 对象

c# - WPF 错误的 KeyDown ASCII 代码

c# - 来自 Telerik RAD Controls 的 JavaScript

C#.NET 使用 isAuthenticated

c# - 为什么我们需要模拟框架?

c# - 使用 Selenium webdriver C# 为只读字段断言值

c# - 防止 NUnit 测试根据环境运行