ExpectedExceptionAttribute在MSTest中无法正常工作

8

这很奇怪,但是突然间ExpectedExceptionAttribute在我这里停止工作了。不确定发生了什么问题。我同时运行VS 2010和VS 2005。它在VS 2010中无法工作。这个测试应该通过,但是它失败了:

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Test_Exception()
{
    throw new ArgumentNullException("test");
}

有什么想法吗?这真的很糟糕。

我也遇到了同样的问题,但是找不到任何相关信息。还有其他人也遇到了相同的问题。https://dev59.com/lnE85IYBdhLWcg3wwWQb - Jon Mitchell
你是在调试还是运行测试? - Joop
5个回答

12

不是为了重提一个已经结束的讨论,但是当这个问题突然发生在我身上时,我遇到了同样的情况。我最终找到了问题所在,这可能与Jon发现的有关。ExpectedException属性似乎只在项目被识别为TestProject时才起作用。(不仅仅是.Net程序集)

卸载该项目,编辑csproj文件并检查是否存在以下设置:

<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

(假设您使用的是VS2010项目) 重新加载项目并重新构建。预期异常测试现在应该通过。

我们遇到了这个问题,当我们将测试从NUnit标准化为MSTest时(感谢TFS CI Build),我们发现用[ExpectedException(Type)]代替了Assert.Throws<>的简单灵活性后,(更不用说失去了[TestCase()]!)预期异常测试无缘无故失败了。切换回带有ExpectedException的NUnit,没问题,但是MSTest拒绝运行它。

毫无疑问,我会推动恢复使用NUnit,因为我找到了这个: http://blog.shawnewallace.com/2011/02/running-nunit-tests-in-tfs-2010.html


1
嗨,史蒂夫!回答旧问题并不丢人,尤其是给出这样好的答案!谢谢! - tmesser
我实际上在 MsTest 中使用 Nunit 构造(Assert.throws);-) - Konstantin
它在我的VS2012中也起作用。但更奇怪的是:我有许多普通的类库都带有这个ExpectedException,而且运行得非常好。即使是出问题的项目曾经也能正常工作,但突然间就停止了工作。 - JotaBe

2

我有另一个答案,不需要编辑csproj文件。似乎问题的根本原因只是缺少引用。 我将Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll添加到项目的引用中,并在代码文件中添加了using Microsoft.VisualStudio.TestTools.UnitTesting;。该dll可以在以下位置找到:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\

或者

C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\

我希望能够帮助任何人节省一些时间。


2

这个线程出现在谷歌搜索结果中。我今天也遇到了同样的问题,但出现原因不同,我会在这里添加另一种可能的答案。

我对某些带有[ExpectedException]属性的函数进行了单元测试,但最近的代码更新使得被测试的函数变成了async,以提高性能。

这导致这些单元测试失败。简单的解决方法是将单元测试也设为async,返回一个任务并等待函数调用:

[TestMethod]
[ExpectedException(typeof(Exception))]
public async Task UnitTestAnAsyncFunction()
{
    await sut.DoStuffAsync();

    //Assert
    //ExpectedException
} 

1

我曾经遇到过同样的问题,但最终成功解决了。不太确定是怎么做到的,但以下是我在它停止工作到重新开始工作之间所做的事情清单:

  • 将被测试的项目转换为.NET 4
  • 关闭 CodeCoverage
  • 再次开启 CodeCoverage
  • 在测试项目上执行 RebuildAll 操作

不确定哪一步起了作用。希望这能帮到你!


0

另一个答案。今天我将一个Visual Studio 2008(net35)的MSTest项目升级到了Visual Studio 2017(net462)。Marcel Kalinowski的答案提到了一个缺失的Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll - 在我的情况下,它是存在的,但引用指向旧的VS2008版本,而其他部分已经升级了。没有感叹号,没有编译错误,所有单元测试都按预期工作,除了那些带有[ExpectedException]属性的测试。

删除引用并添加当前版本(对我来说是10.0.0.0)使这些测试再次正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接