0

我创建了 C# 单元测试(使用 VS 测试工具)。除其他外,还有一些检查异常的测试:

Assert.AreEqual("Object reference not set to an instance of an object.", e.Message);

当我打开我的单元测试文件并在上下文菜单中单击“运行测试”时,一切正常。当我使用 Visual Studio 的测试资源管理器并在那里单击“运行测试”时,我收到异常消息,指出异常消息不同。实际上,它与我正在检查的相同,但使用另一种语言。在这两种情况下运行的测试是相同的,没有语言变化或其他任何东西,只是简单的逻辑测试。我的操作系统是英文的,Visual Studio 也是如此。我在另一个解决方案中进行了类似的测试,并且一切正常。这个解决方案和我正在为其编写单元测试的项目之一是由一位拥有该外语系统的同事创建的。但是,我在任何地方都找不到这样的设置。有人知道这些可能在哪里吗?如何让测试始终以英语运行?

4

3 回答 3

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());
于 2016-04-25T10:52:40.633 回答
0

这是我的测试解决方案,以防其他人需要它。当测试依赖于语言时,这并不是很好,所以我现在检查异常类型:

Assert.IsInstanceOfType(e, typeof(ArgumentNullException));

但是,我仍然想知道该语言的来源。当我所有的东西都是英文时,我真的希望它是英文的。

于 2016-04-25T11:09:01.057 回答
0

你为什么不只使用 Throws 有特定的例外?检查字符串消息真的很糟糕。在我看来,它甚至比使用 IsInstanceOfType 更干净

var testDelegate = () => MyService.Method(params);
Assert.Throws<NullException>(testDelegate);
于 2017-01-12T20:57:59.813 回答