【问题标题】:Test run errors with MSTest in VS2010在 VS2010 中使用 MSTest 测试运行错误
【发布时间】:2011-02-15 05:41:42
【问题描述】:

当我运行单元测试时,所有测试都通过了,但不是“测试运行成功”或任何成功消息,而是在小栏中显示“测试运行错误”,告诉我有多少测试通过,即使我所有的测试都通过了。

当我点击文本时,我被带到一个页面,告诉我发生了以下两件事:

警告:测试运行部署期间发生冲突:无法部署测试容器 [...]\Booking.Web.Tests.dll 直接或间接引用的部署项“[...]\Booking.Web.dll”到 'Booking.Web.dll' 因为否则文件 '[...]\Booking.Web.dll' 将覆盖部署项 '[...]\Booking.Web.dll' 直接或间接引用由 '[. ..]\Booking.Web.Tests.dll'

错误:无法初始化 ASP.NET 项目“Booking.Web” 抛出异常:无法正确配置网站;获取 ASP.NET 进程信息失败。请求“http://localhost:54131/VSEnterpriseHelper.axd”返回错误:远程服务器返回错误:(500) 内部服务器错误。

我不明白它在抱怨什么。如何摆脱这些错误?

(供参考:Booking.Web 是一个 ASP.NET MVC 2 项目,Booking.Web.Tests 是一个测试项目,[...] 是我的环境中项目的完整本地路径,在大多数情况下以上案例到Booking.Web项目内的/bin/debug/文件夹)

更新:按照指示,我在事件查看器中查找了更多信息。这是我发现的:

3008 发生配置错误。
2010 年 5 月 8 日凌晨 2:26:15
2010 年 5 月 8 日上午 12:26:15
4ffbe9180c3d4c02adb9ac4d61dd0928
1
1
0
4484bbf4-1-129177519750954331
完整
/
D:\...\Booking.Web\
AASLOEG

1876
WebDev.WebServer40.EXE
阿斯洛格\托马斯
配置错误异常
无法加载文件或程序集“Ninject.Web.Mvc,Version=2.0.0.0,Culture=neutral,PublicKeyToken=79764a4ef1548af1”或其依赖项之一。无法验证强名称签名。程序集可能已被篡改,或者它被延迟签名但未使用正确的私钥完全签名。 (来自 HRESULT 的异常:0x80131045)在
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) at
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() 在
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) 在
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) 在
...荒谬的堆栈跟踪。

【问题讨论】:

  • 在单元测试中引用 ASP.NET 项目几乎总是一个坏主意。
  • 好的...那么我应该如何重构才能摆脱这种情况?
  • 在单元测试中引用 ASP.NET MVC 项目是一种常见的做法。否则你将如何测试控制器的动作?

标签: c# asp.net-mvc unit-testing visual-studio-2010 mstest


【解决方案1】:

首先 - 您启用了代码覆盖率。你可以阅读here 了解它。所以单元测试没有问题。这是代码覆盖率问题。

第二件事 - 这个警告没问题 - 没关系。

第三件事——这个错误——这是关键问题。

可能存在不同的问题 - 最常见的是您应该引用更多程序集。要找出应该加载的确切内容,您必须转到 Event Viewer 并查看 Windows Logs->Application

【讨论】:

  • 我发现 Ninject.Web.Mvc 有一个错误(为此我下载了源代码并自己针对 Ninject 2 和 ASP.NET MVC 2 dll 构建......)但我无法摆脱错误,因为我无法弄清楚为什么加载 dll 无法正常工作。我将使用在事件查看器中找到的信息更新我的帖子。另外,正如你所说,我启用了代码覆盖 - 但你说的哪一部分受此影响?
  • 好吧,你可以关闭代码覆盖。但是,如果您需要它,您应该了解为什么会出现此问题。实际上,如果您自己构建它们,您是否已签署它们? 'Ninject.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=79764a4ef1548af1 - 表示它正在寻找签名的程序集。我明白 - 这看起来很奇怪,您可以运行网站,但由于某种原因没人能理解的代码覆盖率需要在应用程序中包含更多程序集。
  • 我相信我还没有签名 - 应该吗?我如何能?或者我可以等到 Ninject 发布一个针对 .Net 4 的新版本,这会自动进行吗?
  • 好的,我已经下载了 Ninject 2 并编译了 Ninject.Web.Mvc 并将其添加到示例 mvc 项目中,打开了代码覆盖并重现了您的错误。要摆脱它,您应该执行以下操作。关闭 Ninject.Web.Mvc 的签名。您可以在 Project->Properies->Signing 选项卡中执行此操作,然后取消选中 Sign The Assembly 复选框。重建。用无符号替换有符号程序集。错误应该会消失。
  • 非常感谢!我现在无法将您的答案标记为正确的答案 - 我认为这是因为赏金期已过,但无论如何您应该已经收到赏金积分,对吧?再次感谢!
【解决方案2】:

我遇到了与 MS-Test 相关的相同错误,抱怨 DLL 可以“覆盖部署项 blah.dll”。

发生这种情况是因为我同时为多个 DLL 运行 MS-Test,如下所示:

mstest.exe /testcontainer:Tests.web.dll /testcontainer:Tests.svcs.dll /testcontainer:Tests.core.dll

当 MS-Test 运行它时,它试图从测试中获取所有输出 DLL,并将它们放在测试运行的 out /Out 目录中。就我而言,Tests.svcs.dllTests.core.dll 都引用了同一个程序集 (Core.dll),因此它尝试了将该 DLL 复制到同一位置两次(从而导致警告)。

为了解决这个问题,我将每个程序集的测试运行分开,每个程序集都有自己的 /Out 文件夹用于输出 DLL

mstest.exe /testcontainer:Tests.web.dll

mstest.exe /testcontainer:Tests.svcs.dll

mstest.exe /testcontainer:Tests.core.dll

【讨论】:

  • 并非总是可以这样做。在我的情况下,我在 CI 服务器中运行测试,我必须一起运行它们以生成单个结果文件
  • 您使用的是什么 CI?我在 Hudson/Jenkins 中运行所有测试,我们用来显示结果的插件能够合并多个结果文件。我们只是给它一个像这样的通配符:/TestResults/*.trx
  • 我正在使用 Jenkins。您使用哪个插件来处理 trx 结果?
  • 我们使用的是MSTest Plugin 0.7。配置截图可以click here.
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多