如何在Visual Studio Test中通过资源文件中的特定异常消息测试预期异常?

Visual Studio Test可以使用ExpectedException属性检查预期的异常。 你可以传入一个像这样的异常:

[TestMethod]
[ExpectedException(typeof(CriticalException))]
public void GetOrganisation_MultipleOrganisations_ThrowsException()

您也可以像这样检查ExpectedException中包含的消息:

[TestMethod]
[ExpectedException(typeof(CriticalException), "An error occured")]
public void GetOrganisation_MultipleOrganisations_ThrowsException()

但是,当测试I18N应用程序时,我会使用资源文件来获取该错误消息(如果需要,甚至可以决定测试错误消息的不同本地化版本,但Visual Studio不会让我这样做:

[TestMethod]
[ExpectedException(typeof(CriticalException), MyRes.MultipleOrganisationsNotAllowed)]
public void GetOrganisation_MultipleOrganisations_ThrowsException()

编译器会出现以下错误:

属性参数必须是常量表达式,属性的typeof表达式或数组创建表达式

有没有人知道如何测试一个有资源文件消息的异常?


我考虑过的一个选择是使用自定义异常类,但基于经常听到的建议,例如:

“如果你有一个错误条件可以以不同于其它现有的异常的方式进行编程处理,那么你可以创建并抛出自定义异常,否则就抛出一个现有的异常。 资源

我不希望在正常流程中处理异常(这是一个严重的例外,所以我会进入恐慌模式),我不认为为每个测试用例创建例外是正确的。 有什么意见?


只是一个意见,但我会说错误文字:

  • 是测试的一部分,在这种情况下,从资源中获取它将是'错误的'(否则可能会导致资源严重受损),因此只需在更改资源时更新测试(或测试失败)
  • 不是测试的一部分,你应该只关心它抛出异常。
  • 请注意,第一个选项应允许您测试多种语言,只要能够使用语言环境运行即可。

    至于多个例外情况,我来自C ++领域,在大型平局中创建加载和加载异常(对于每个“throw”语句的一个点)是可以接受的(如果不常见),但.Net的元数据系统可能不会不喜欢那个,所以那个建议。


    我会建议使用辅助方法而不是属性。 像这样的东西:

    public static class ExceptionAssert
    {
      public static T Throws<T>(Action action) where T : Exception
      {
        try
        {
          action();
        }
        catch (T ex)
        {
          return ex;
        }
        Assert.Fail("Exception of type {0} should be thrown.", typeof(T));
    
        //  The compiler doesn't know that Assert.Fail
        //  will always throw an exception
        return null;
      }
    }
    

    然后你可以写下你的测试:

    [TestMethod]
    public void GetOrganisation_MultipleOrganisations_ThrowsException()
    {
      OrganizationList organizations = new Organizations();
      organizations.Add(new Organization());
      organizations.Add(new Organization());
    
      var ex = ExceptionAssert.Throws<CriticalException>(
                  () => organizations.GetOrganization());
      Assert.AreEqual(MyRes.MultipleOrganisationsNotAllowed, ex.Message);
    }
    

    这也有一个好处,就是它可以验证是否将异常抛出到您期望抛出的行上,而不是在您的测试方法中的任何位置。


    ExpectedException消息参数与异常消息不匹配。 相反,如果预期的异常事实上没有发生,则这是打印在测试结果中的消息。

    链接地址: http://www.djcxy.com/p/96951.html

    上一篇: How can I test for an expected exception with a specific exception message from a resource file in Visual Studio Test?

    下一篇: Mixing generic methods and extension methods