我如何使用Assert来验证是否抛出异常?

我如何使用Assert(或其他测试类?)来验证是否引发了异常?


对于“Visual Studio团队测试”,看起来您将ExpectedException属性应用于测试的方法。

来自此处文档的示例:使用Visual Studio团队测试进行单元测试演练

[TestMethod]
[ExpectedException(typeof(ArgumentException),
    "A userId of null was inappropriately allowed.")]
public void NullUserIdInConstructor()
{
   LogonInfo logonInfo = new LogonInfo(null, "P@ss0word");
}

通常你的测试框架会为此提供答案。 但是,如果它不够灵活,你总是可以这样做:

try {
    somethingThatShouldThrowAnException();
    Assert.Fail(); // If it gets to this line, no exception was thrown
} catch (GoodException) { }

正如@Jonas指出的那样,这不适用于捕获基础异常:

try {
    somethingThatShouldThrowAnException();
    Assert.Fail(); // raises AssertionException
} catch (Exception) {
    // Catches the assertion exception, and the test passes
}

如果您绝对必须捕获异常,则需要重新抛出Assert.Fail()。 但是,真的,这是一个标志,你不应该手写这个; 检查你的测试框架的选项,或看看你是否可以抛出更有意义的异常来测试。

catch (AssertionException) { throw; }

你应该能够将这种方法适应于任何你喜欢的方式 - 包括指定要捕捉的异常类型。 如果您只希望某些类型,请使用以下命令完成catch块:

} catch (GoodException) {
} catch (Exception) {
    // not the right kind of exception
    Assert.Fail();
}

我的首选方法是编写一个名为Throws的方法,并像使用其他Assert方法一样使用它。 不幸的是,.NET不允许你编写一个静态的扩展方法,所以你不能使用这个方法,就好像它实际上属于Assert类中的构建; 只需创建另一个名为MyAssert或类似的东西。 这个类看起来像这样:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace YourProject.Tests
{
    public static class MyAssert
    {
        public static void Throws<T>( Action func ) where T : Exception
        {
            var exceptionThrown = false;
            try
            {
                func.Invoke();
            }
            catch ( T )
            {
                exceptionThrown = true;
            }

            if ( !exceptionThrown )
            {
                throw new AssertFailedException(
                    String.Format("An exception of type {0} was expected, but not thrown", typeof(T))
                    );
            }
        }
    }
}

这意味着你的单元测试看起来像这样:

[TestMethod()]
public void ExceptionTest()
{
    String testStr = null;
    MyAssert.Throws<NullReferenceException>(() => testStr.ToUpper());
}

它看起来和行为更像你的单元测试语法的其余部分。

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

上一篇: How do I use Assert to verify that an exception has been thrown?

下一篇: NUnit vs Visual Studio 2008's Test Projects for Unit Testing?