我通常使用Nunit,但在我目前的项目中,我使用的是MSTest。现在我有一个测试,它期望一个异常,但仍然失败,我不知道为什么。
这是我用来复制问题的一个简单示例:
[TestMethod, ExpectedException(typeof(ErrorResponseException))]
public void should_throw_exception()
{
throw new ErrorResponseException();
}
ErrorResponseException是一个只从Exception继承的类,也就是说,任何人都知道为什么会失败,我希望它能够通过。
答案 0 :(得分:14)
在NUnit中,我会避免使用ExpectedException并使用Assert.Throws(Exception Asserts)。它为您提供更精细的控制。否则,如果测试方法的任何部分抛出该异常,则测试将通过。
在MSTest中,您可以使用旧式构造获得相同级别的控制:
try
{
// code that you expect to throw goes here
Assert.Fail("Expected MyException");
}
catch (MyException ex)
{
// optionally assert on the message - this can make tests fragile though
}
有了这个,就不需要ExpectedException属性了。
(这个概念来自David Astels的“测试驱动开发:实用指南”一书。)
答案 1 :(得分:4)
无耻的插件,但是我编写了一个简单的程序集,它使用 Assert.Throws()语法在MSTest中使异常和异常消息的断言更容易一些,更易读。我写了一篇blog post的详细信息。
答案 2 :(得分:3)
如果您正在使用MSTest 10.0.1.0.0,ExpectedException似乎无法正常工作,请改用10.0.0.0.0。
答案 3 :(得分:3)
我遇到了同样的问题并找到了另一种解决方案。我的测试方法是async
,但我忘记了我的testmethod中调用前面的await
关键字。
测试:
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public async Task ShouldDoSomething(){
// notice the missing await in the next line
this.testObject.DoSomethingAsync();
}
测试方法:
public async Task<bool> DoSomethingAsync(){
if(something)
{
throw new InvalidOperationException("Error while doing something");
}
return false;
}
当我像这样运行我的测试时失败了。但是,只要我将测试更改为以下内容:
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public async Task ShouldDoSomething(){
await this.testObject.DoSomethingAsync();
}
它对我有用。
答案 4 :(得分:1)
在Visual Studio 15
依赖MSTest.TestAdapter v1.1.18
和MSTest.TestFramework v1.1.18
的{{1}}中,您还可以使用
Assert.ThrowsException<ArgumentNullException>(() => MethodThatThrowsArgumentNullException());
答案 5 :(得分:0)
ExpectedExceptionAttribute现在在多个DLL中定义,单元测试运行器可能期望从不同的DLL看到您的测试项目正在使用的属性。
作为一个例子,我在VS2017中创建了一个单元测试项目,它从Microsoft获得ExpectedException.VisualStudio.TestPlatform.TestFramework V14.0.0.0 - 测试在IDE中通过但在TeamCity中失败,即使使用VSTest runner在2017版。
我最终通过在我的测试项目中删除对此DLL的所有引用并将其替换为版本10.0.0.0的Mirosoft.VisualStudio.QualityTools.UnitTestFramework
来传递给TeamCity