【发布时间】:2018-06-06 15:48:52
【问题描述】:
我正在尝试向网络表单项目添加测试。有一种静态方法可以从资源文件中获取行。我正在尝试测试的其中一个类依赖于从资源文件中获取文本。
public static class MyStaticClass {
public static string getText(String name)
{
String s = HttpContext.GetGlobalResourceObject("MyResources", name).ToString();
return s;
}
}
public class ClassUnderTest
{
// returns: "Hey it's my text"
private string _eg = MyStaticClass.getText("label_in_resources.resx_file")
}
class UnitTests
{
[Test]
public void TestMyClass()
{
ClassUnderTest _cut = new ClassUnderTest();
// errors out because ClassUnderTest utilizes getText
// which requires HttpContext.GetGlobalResourceObject
// ... other stuff
}
}
注意:这些都是简单的例子。
问题是我收到一条测试失败的消息:
消息:System.NullReferenceException:对象引用未设置为对象的实例。
根据我的调查,我确定这是因为HttpContext 在这些测试中为空。
我看过很多关于模拟 HttpContext 的 SO 帖子,但我认为我并不完全理解他们到底在做什么,因为他们通常处理的是 MVC 而不是 Webforms。他们中的大多数仍然使用HttpContextBase 和/或HttpContextWrapper 但同样,我不知道如何实现它们。
另外 - 我没有直接测试 getText 方法。我知道它有效。我正在测试一个使用它的类。在这种情况下,嘲笑HttpContext 会有所帮助吗?
我确实意识到这是一种单元测试/集成测试的混合体,所以如果这不是最好的方法,我会全神贯注……或者……更确切地说……眼睛。
编辑
现在,如果HttpContext.GetGlobalResourceObject 的结果为空,我修改了我的getText 方法以返回键(名称)。然后我更新了我的测试以期望键而不是值。这并不理想,但它有效并允许我继续。如果有更好的方法,请告诉我。
public static class MyStaticClass {
public static string getText(String name)
{
String s = HttpContext.GetGlobalResourceObject("MyResources", name);
return s != null ? s.ToString() : name;
}
}
【问题讨论】:
-
最好的选择是用具有接口的包装器完全替换
GetGlobalResourceObject。但是,如果你不能,我发现 Microsoft Fakes 是我在测试时不得不模拟静态数据的首选。 -
@TyCobb 你能举个例子吗?我相信我已经包装了
GetGlobalResourceObject,除非我误解了。另外,如果不清楚,我不会直接测试静态方法本身,但这就是错误的根源。 -
我正在做一个。我错过了
getText是静态的。您可以伪造该课程。现在正在处理一个示例。
标签: c# unit-testing webforms nunit-3.0