我已经创建了C#单元测试(使用VS测试工具)。其中,有测试检查例外情况:
Assert.AreEqual("Object reference not set to an instance of an object.", e.Message);
当我打开单元测试文件并单击上下文菜单中的“运行测试”时,一切正常。当我使用Visual Studio的测试资源管理器并在那里单击“运行测试”时,我得到异常,说异常的消息是不同的。实际上,它与我正在检查的那个相同,但是用另一种语言。在这两种情况下运行的测试是相同的,没有语言更改或其他任何东西,只是简单的逻辑测试。我的操作系统也是英文版,Visual Studio也是。我在另一个解决方案中有类似的测试,一切正常。这个解决方案和我正在编写单元测试的项目之一是由一个拥有该外语系统的同事创建的。但是,我无法在任何地方找到这样的设置。有人知道这些可能在哪里吗?如何让测试始终以英语运行?
答案 0 :(得分:1)
尝试使用HResult。
Assert.AreEqual(val, e.HResult)
不应该根据语言而改变。 HResult是分配给特定异常的编码数值,因此使用HResult可以知道抛出了哪个异常。
编辑:
或者,如果您知道您期望的异常,您可以编写自己的例外 - " expecter"。
protected static void ThrowsException<T>(Action action) where T : Exception
{
var thrown = false;
try
{
action();
}
catch (T)
{
thrown = true;
}
Assert.IsTrue(thrown);
}
然后像这样使用它:
ThrowsException<IndexOutOfRangeException>(() => MyController.MyAction());
答案 1 :(得分:0)
这是我的测试解决方案,以防其他人需要它。当测试依赖于语言时,它并不是很好,所以我现在检查异常类型:
Assert.IsInstanceOfType(e, typeof(ArgumentNullException));
但是,我仍然想知道语言的来源。当我用英语完成所有内容时,我真的希望它是英文的。
答案 2 :(得分:0)
为什么不使用具有特定异常的抛出?检查字符串消息真的很糟糕。在我看来,它比使用IsInstanceOfType
更清晰var testDelegate = () => MyService.Method(params);
Assert.Throws<NullException>(testDelegate);