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);