MSTest ExpectedException失败

时间:2011-11-03 12:36:56

标签: .net exception mstest

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

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

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

ErrorResponseException是一个只从Exception继承的类,也就是说,任何人都知道为什么会失败,我希望它能够通过。

6 个答案:

答案 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.18MSTest.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