为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Assert验证是否已引发异常?

/ 猿问

如何使用Assert验证是否已引发异常?

回首忆惘然 2020-02-03 15:05:55

如何使用Assert(或其他Test类?)来验证是否已引发异常?



查看完整描述

3 回答

?
桃花长相依

对于“ Visual Studio Team Test”,您似乎将ExpectedException属性应用于该测试的方法。


这里的文档样本:使用Visual Studio Team Test进行单元测试的演练


[TestMethod]

[ExpectedException(typeof(ArgumentException),

    "A userId of null was inappropriately allowed.")]

public void NullUserIdInConstructor()

{

   LogonInfo logonInfo = new LogonInfo(null, "P@ss0word");

}


查看完整回答
反对 2020-02-03
?
HUH函数

通常,您的测试框架会对此提供答案。但是,如果它不够灵活,可以随时执行以下操作:


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

}

如果绝对必须捕获Exception,则需要重新抛出Assert.Fail()。但是,实际上,这是一个不应该手写的迹象;检查测试框架中的选项,或者查看是否可以抛出更有意义的异常以进行测试。


catch (AssertionException) { throw; }

您应该能够使此方法适应您喜欢的任何方式-包括指定要捕获的异常类型。如果只希望使用某些类型,请完成以下步骤catch:


} catch (GoodException) {

} catch (Exception) {

    // not the right kind of exception

    Assert.Fail();

}


查看完整回答
反对 2020-02-03
?
天天世纪

实现此目的的首选方法是编写一个称为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());

}

它的外观和行为更像其余的单元测试语法。


查看完整回答
反对 2020-02-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信