【问题标题】:How can I make ReSharper use .NET 4.5 when running tests?如何让 ReSharper 在运行测试时使用 .NET 4.5?
【发布时间】:2014-05-14 13:29:24
【问题描述】:

我有一行代码在我的单元测试中与在我的应用程序中的行为不同,我正在尝试确定原因。这行代码是这样的:

var valid = Uri.IsWellFormedUriString("1.1.1.1:12345", UriKind.RelativeOrAbsolute);

使用 .NET 4.0 时,这会将 valid 设置为 true。移至 .NET 4.5 后,这开始给出错误。我不太关心这个,因为它很容易修复。但它显然不容易测试。我尝试在修复之前编写单元测试以确认问题,但单元测试通过了。我将测试代码复制到一个新的控制台项目中,并在那里显示了问题。控制台项目设置为.NET 4.0时,值为true,设置为.NET 4.5时,值为false。但在我的单元测试中,它总是正确的,即使我的测试项目设置为 .NET 4.5。所以看起来 ReSharper 使用的是旧版本的 .NET。

我正在使用 VS2012 和 reSharper 7.1.3,它被设置为使用内置的 NUnit 2.6.2 运行测试,它声称能够使用 4.5 框架运行测试。从 NUnit 文档中,我的印象是这是由配置文件中的设置控制的,但我不确定哪个文件中的哪个设置。

假设我已经正确理解了这个问题,谁能告诉我如何配置 ReSharper 使用的 NUnit 版本以使用 .NET 4.5?

【问题讨论】:

  • 您的测试项目是否有app.configsupportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"? (IDE 通常会为您添加此内容。)我不知道 R# 的测试运行程序是否使用此内容,但检查一下也无妨。
  • 我正在使用 LINQPad v4.48.01 检查那行代码,它正在打印出true(据我所知,LINQPad 使用的是 .NET 4.5)。
  • (虽然this 可能是相关的)。
  • 这是一个兼容性问题。 .Net 4.5 中进行了一些被认为是破坏性的更改。进行更改的人“怪异”了新行为,使其仅在应用程序针对较新版本时才处于活动状态。他们通过检查默认 AppDomain 的条目程序集上的 TargetFrameworkAttribute 来确定目标。大多数单元测试运行器的问题在于,无论单元测试 dll 的目标版本如何,它们都使用单个运行器程序集。我相信 MSTest 通过在设置 appdomain 时指定目标框架来解决此问题。 NUnit 也应该这样做。
  • @Joe 我的项目没有 app.config;我在你提到的那一行添加了一个,但它似乎没有帮助。

标签: .net nunit resharper


【解决方案1】:

正如@TheESJ 所说,这是由于 .net 4.5 框架中的“怪癖模式”。 ReSharper 8.2 中的测试运行程序仅为 .net 4.0,因此它会触发 quirks 模式,并且会出现意外行为。 ReSharper 8.2.1(目前在 RC,但 RTM Real Soon Now)中的测试运行器也直接支持 4.5。如果您的程序集是 4.5,则会启动 4.5 运行程序可执行文件,并且您不会获得 quirks 模式。

【讨论】:

  • 确认一下,您是说我使用的 ReSharper 版本不支持我想要的功能?这就说得通了;我将测试移到 MSTest 项目中,ReSharper 仍然没有暴露错误,而 TestExplorer 暴露了。
  • 正确 - 我没有注意到你说的是 ReSharper 7。这只是在 ReSharper 8.2.1 中修复的问题,并添加了一个 .net 4.5 特定的测试运行程序可执行文件。跨度>
猜你喜欢
  • 2012-06-28
  • 2012-10-01
  • 2017-12-26
  • 1970-01-01
  • 2013-11-05
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多