使用Moq在NUnit中模拟HttpContext.GetGlobalResourceObject

时间:2014-03-07 15:43:23

标签: 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的所有调用从单元测试指向我的mock类。这要问很多吗? :)

1 个答案:

答案 0 :(得分:1)

  1. 让您的受测试的课程依赖于HttpContextBaseabstract)。

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

  3. 然后在您的单元测试中,您可以传入模拟HttpContextBaseGetGlobalResourceObject你控制。

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