我应该使用nunit的Assert.Throws方法还是Expected Exception属性?

我注意到这些似乎是testingexception的两个主要方法。

Assert.Throws<Exception>(()=>MethodThatThrows()); [ExpectedException(typeof(Exception))] 

我想知道哪个最好? 有没有任何理由赞成或反对这两个? 或者只是个人喜好?

第一个允许你testing多个exception,多个调用:

 Assert.Throws(()=>MethodThatThrows()); Assert.Throws(()=>Method2ThatThrows()); 

第二个只允许您testing每个testingfunction的一个例外。

主要区别是:

如果exception发生在testing方法的任何地方, ExpectedException()属性使testing通过。
Assert.Throws()的使用允许指定预期exception的代码的exact位置。

NUnit 3.0完全放弃了对ExpectedException官方支持。

所以,我绝对喜欢使用Assert.Throws()方法而不是ExpectedException()属性。

我更喜欢assert.throws,因为它允许我在抛出exception之后validation和断言其他条件。

  [Test] [Category("Slow")] public void IsValidLogFileName_nullFileName_ThrowsExcpetion() { // the exception we expect thrown from the IsValidFileName method var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName("")); // now we can test the exception itself Assert.That(ex.Message == "Blah"); } 

你也可以input你所期望的错误(比如旧的attrib版本)。

 Assert.Throws<System.InvalidOperationException>(() => breakingAction()) 

如果你使用NUnit旧版本( <= 2.0 ),那么你需要使用ExpectedException

如果您使用的是2.5或更高版本,则可以使用Assert.Throw()

https://github.com/nunit/docs/wiki/Breaking-Changes

如何使用: https : //www.nunit.org/index.php?p=exceptionAsserts&r=2.5