2011-11-03 86 views
11

我通常使用Nunit,但是在我当前的项目中,我正在使用MSTest。现在我有一个测试,期望有一个例外,但仍然失败,我不知道为什么。MSTest ExpectedException失败

这里是我用来复制的问题一个简单的例子:

[TestMethod, ExpectedException(typeof(ErrorResponseException))] 
     public void should_throw_exception() 
     { 
      throw new ErrorResponseException(); 
     } 

的ErrorResponseException是刚刚从异常继承的类,这是它,任何人都知道这是为什么失败,我希望它通过。

回答

14

在NUnit中,我会避​​免ExpectedException并使用Assert.Throws(异常断言)。它给你更细致的控制。否则如果测试方法的任何部分抛出异常,测试将通过。

在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属性。

(这个概念来自于书本测试驱动开发:由大卫Astels的实用指南。)

+0

在我的实际情况是非常相似,你说把它传递的那一刻是什么,我只是觉得奇怪它在MSTest中不起作用。那么将继续使用这种做法。 – Grofit

+3

MSTest不正确地支持它,它是一个错误。这也是超级跛脚!上述解决方法将正常工作 –

3

无耻的插头,但我写了一个简单的装配,使得主张对异常和异常消息变得更轻松,更可在MSTest中使用Assert.Throws()语法。我写了一个blog post与全部细节。

3

如果您使用的是MSTest 10.0.1.0.0,ExpectedException似乎无法正常工作,请改为使用10.0.0.0.0。

+1

正确。我现在面临这个问题。 – orange

2

我刚刚遇到同样的问题,发现了另一个解决方案。我的测试方法是async,但在我的测试方法中,我忘记了调用的关键字。

测试:

[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(); 
} 

它为我工作。

0

ExpectedExceptionAttribute现在在多个DLL中定义,并且单元测试运行器可能希望从不同的DLL看到您的测试项目正在使用的属性。

作为一个例子,我在VS2017中创建了一个单元测试项目,它从MicrosoftVisualStudio.TestPlatform.TestFramework V14.0.0.0获取ExpectedException - 测试通过IDE但在TeamCity中失败,即使使用VSTest亚军在版本2017.

我最终通过删除在我的测试项目中的这个DLL的所有引用,并用Mirosoft.VisualStudio.QualityTools的10.0.0.0版本替换它们,以通过TeamCity。UnitTestFramework

1

Visual Studio 15MSTest.TestAdapter v1.1.18MSTest.TestFramework v1.1.18依赖你也可以使用

Assert.ThrowsException<ArgumentNullException>(() => MethodThatThrowsArgumentNullException());