【问题标题】:Mocking HttpContext.GetGlobalResourceObject in NUnit with Moq使用 Moq 在 NUnit 中模拟 HttpContext.GetGlobalResourceObject
【发布时间】:2014-03-07 15:43:23
【问题描述】:

我正在尝试编写一个单元测试来测试使用 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 的所有调用从单元测试定向到我的模拟类。这要求太多了吗? :)

【问题讨论】:

    标签: c# nunit moq httpcontext


    【解决方案1】:
    1. 让你的被测类依赖于HttpContextBase (即abstract)。

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

    3. 然后在你的单元测试中你可以传入一个模拟HttpContextBase GetGlobalResourceObject 由你控制。

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

    【讨论】:

    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2011-06-13
    • 2019-09-11
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多