C# NUnit预期会出现异常
我有一组测试用例,其中一些预期会抛出异常。因此,我为这些测试设置了属性,以期望出现如下异常:C# NUnit预期会出现异常,c#,nunit,continuous-integration,teamcity,C#,Nunit,Continuous Integration,Teamcity,我有一组测试用例,其中一些预期会抛出异常。因此,我为这些测试设置了属性,以期望出现如下异常: [ExpectedException("System.NullReferenceException")] 当我在本地运行测试时,一切都很好。但是,当我将测试移到运行TeamCity的CI服务器时,所有预期出现异常的测试都会失败。这是一个已知的错误 我知道NUnit还提供了Assert.Throws和Assert.Throws方法 我的问题是如何使用这些属性而不是当前使用的属性 我环顾了一下StackO
[ExpectedException("System.NullReferenceException")]
当我在本地运行测试时,一切都很好。但是,当我将测试移到运行TeamCity的CI服务器时,所有预期出现异常的测试都会失败。这是一个已知的错误
我知道NUnit还提供了Assert.Throws
和Assert.Throws
方法
我的问题是如何使用这些属性而不是当前使用的属性
我环顾了一下StackOverflow,尝试了一些似乎都不适合我的东西
是否有一个简单的单行解决方案可以使用此选项?我不确定您尝试了什么会给您带来麻烦,但您可以简单地传入lambda作为Assert.Throws的第一个参数。以下是我通过的一项测试中的一项:
Assert.Throws<ArgumentException>(() => pointStore.Store(new[] { firstPoint }));
这将正常通过,因为o.Foo()
将引发空引用异常
然后,您将删除ExpectedException
属性,并将对o.Foo()
的调用包装在Assert.Throws
中
[Test]
public void TestFoo()
{
MyObject o = null;
Assert.Throws<NullReferenceException>(() => o.Foo());
}
[测试]
公共void TestFoo()
{
MyObject o=null;
Assert.Throws(()=>o.Foo());
}
“尝试调用以委托形式表示的代码段,以验证它是否引发特定异常。”()=>DoSomething()
语法表示lambda,本质上是一个匿名方法。因此,在本例中,我们告诉Assert.Throws
执行代码段o.Foo()
所以不,你不能像添加属性那样只添加一行;您需要在调用
Assert.Throws
时显式地包装将引发异常的测试部分。您不必使用lambda,但这通常是最方便的方法。这里有一个简单的例子,可以同时使用这两种方法
string test = null;
Assert.Throws( typeof( NullReferenceException ), () => test.Substring( 0, 4 ) );
Assert.Throws<NullReferenceException>( () => test.Substring( 0, 4 ) );
字符串测试=null;
抛出(typeof(NullReferenceException),()=>test.Substring(0,4));
Assert.Throws(()=>test.Substring(0,4));
如果您不想使用lambdas
[Test]
public void Test()
{
Assert.Throws<NullReferenceException>( _TestBody );
}
private void _TestBody()
{
string test = null;
test.Substring( 0, 4 );
}
[测试]
公开无效测试()
{
抛出(_TestBody);
}
私有void_TestBody()
{
字符串测试=null;
测试子串(0,4);
}
默认情况下,TeamCity使用NUnit 2.2.10,它没有ExpectedException。查看TeamCity“NUnit for NAnt”文档,了解如何将其更改为更现代的版本,包括TeamCity提供的特定版本列表。NUnit已添加新记录。异常方法
如果你喜欢将行为和主张分开,那么
行为:
断言:
Assert.NotNull(ex);
我不确定这一切()=>pointStore.Store(new[]{firstPoint})是为了什么。有没有一行,我可以把我的测试功能?谢谢你额外的信息标记,你帮助我把它真正清楚,谢谢!非常感谢。它解决了我的问题。此外,如果o.Foo是可等待的,那么应该使用
Assert.Throws(async()=>await o.Foo())
。
ex = Record.Exception(()={throw new Exception()}
Assert.NotNull(ex);