【发布时间】: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.config和supportedRuntime 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;我在你提到的那一行添加了一个,但它似乎没有帮助。