我正在尝试编写一个单元测试来测试一个使用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类。这要问很多吗? :)
答案 0 :(得分:1)
让您的受测试的课程依赖于HttpContextBase
(abstract
)。
在正常执行中使用HttpContextWrapper
(源自。{1}}
HttpContextBase
)包装HttpContext
并将其提供给您
类。
然后在您的单元测试中,您可以传入模拟HttpContextBase
谁GetGlobalResourceObject
你控制。
这很简单但需要您重新考虑如何设计应用程序的各个部分。这种控制反转对于编写易于单元测试的代码至关重要。使用IoC容器可能会有所帮助。