我正在尝试编写一个单元测试来测试使用 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 的所有调用从单元测试定向到我的模拟类。有那么多要求吗? :)
最佳答案
让您的被测类依赖于
HttpContextBase
(这是抽象
)。在正常执行中使用
HttpContextWrapper
(派生自HttpContextBase
) 来包装HttpContext
并将其提供给您的 类。然后在您的单元测试中,您可以传入模拟
HttpContextBase
谁的GetGlobalResourceObject
由您控制。
它很简单,但需要您重新考虑如何设计应用程序的各个部分。这种控制反转对于编写易于单元测试的代码至关重要。使用 IoC 容器可能会有所帮助。
关于c# - 使用 Moq 在 NUnit 中模拟 HttpContext.GetGlobalResourceObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254470/