ReSharper单元测试无法在bin目录中运行

30

前言

我知道这个问题似乎已经有了答案:

我几乎和ReSharper 10 test runner failing to find AppSettings referenced from external file一样的问题。 但是这些回答说,这个问题应该在 ReSharper 10.0.2 中已经解决了。

问题

我包含了一个名为custom.xml的文件,并且需要从我的单元测试中读取它们。但是我的文件找不到。

我查看了进程运行的位置,并包括了这一行:

var curdir = Directory.GetCurrentDirectory();

我发现,curdirC:\\Users\\MYUSER\\AppData\\Local\\JetBrains\\Installations\\ReSharperPlatformVs11_000

很明显我的文件找不到了。在谷歌上搜索之后,我找到了以上提到的问题。但是这些解决方法都对我无效。

以下是我的设置:

ReSharper Settings

Visual Studio配置

Microsoft Visual Studio Ultimate 2012

版本号:11.0.61219.00 Update 5

Microsoft .NET Framework

版本号:4.6.01038

已安装版本:Ultimate

  • 架构和建模工具 04940-004-0038003-02857
  • Visual Studio 2012团队资源管理器 04940-004-0038003-02857
  • Microsoft Visual Studio 2012中的Team Explorer
  • Visual Basic 2012 04940-004-0038003-02857
  • Microsoft Visual Basic 2012
  • Visual C# 2012 04940-004-0038003-02857
  • Microsoft Visual C# 2012
  • Visual C++ 2012 04940-004-0038003-02857
  • Microsoft Visual C++ 2012
  • Visual F# 2012 04940-004-0038003-02857
  • Microsoft Visual F# 2012
  • Windows Phone SDK 8.0 - DEU 04940-004-0038003-02857
  • Windows Phone SDK 8.0 - DEU
  • ASP.NET 和 Web 工具 2012.3.41009
  • GenerateUnitTest 1.0
  • Git 源代码控制提供程序 1.0.0.0
  • JetBrains ReSharper Ultimate 10.0.2 Build 104.0.20151218.120627
  • 针对 Windows Phone 的 Microsoft 广告 SDK 6.2.923.0
  • 针对 Windows Phone 的 Microsoft 广告 SDK Build 6.2.923.0
  • Microsoft XNA Game Studio 4.0
  • Microsoft XNA Game Studio 4.0
  • NuGet 包管理器 2.8.60318.667
  • PreEmptive Analytics Visualizer 1.0
  • SQL Server 数据工具 11.1.20627.00
  • Microsoft SQL Server 数据工具
  • Git Extensions

1
文件设置为“始终复制”吗? - Joachim Isaksson
该死!所有其他配置文件都在,就是那一个不在! - Rico-E
6个回答

53

您没有列出已安装的任何NUnit版本,但您标记了“nunit”,因此我假设您正在使用它! 此外,我假设NUnit> = 3.0……如果不是这样,请忽略它。 :-)

NUnit 3.0停止更改当前目录。 这本来就是个坏主意,而且在3.0中尤其糟糕,因为不同目录中的多个程序集可能同时运行。

因此,仍然假设问题与NUnit有关,则应使用TestContext.CurrentContext.TestDirectory作为文件位置,而不是使用相对路径。


你永远不知道哪个版本信息是重要的... 你猜对了 :) 但是我该如何将我的 custom.xml 复制到另一个目录中呢?我在生产代码的某个深处使用了 File.ReadAllText("custom.xml")。我不想添加对 NUnit 的引用来测试是否应该使用 TestContext.TestDirectory。而创建一个接受工作目录的重载也不是选项。我假设 custom.xml 位于我的程序集旁边。我的安装程序确保了这一点。我该如何在测试中复现这种情况? - Rico-E
1
在你的生产代码中,有两种方法可供选择:(1) 继续假设程序始终在当前目录下运行,这是一个相当大的假设,但在你的情况下可能是有效的。然而,考虑一下如果cd被设置到其他位置并且你使用完整路径运行程序会发生什么。(2) 实际检查程序集并找出它的位置。如果程序集没有被影子复制,Assembly.Location可以用于此。Assembly.Codebase更好,但需要从结果URI中获取LocalPath。 - Charlie
我应该补充一点,无论你在生产代码中做什么,你的测试代码仍然可以使用TestContext.TestDirectory。 - Charlie
4
看起来对于 NUnit 3.6.1,您可以使用TestContext.CurrentContext.TestDirectory来获取测试运行位置的信息。这对我有用。 - Manfred

9

试试这个:

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

1
在 DLL 中工作正常,但在 WebApi 中无法工作。 - WernerCD

3

当我改变了这个设置后,我的问题得到了解决。

setting


谢谢,这正是我在寻找的。 - JayZ

2

对于这种问题,我找到了一个解决方法 - 在ReSharper设置中关闭了NUnit 2.x的支持(ReSharper -> Options... -> Tools -> Unit Testing -> NUnit)。


这有什么帮助?这是用来干什么的? - Stealth Rabbi
对我有用。谢谢! - Sheena Agrawal

0

我也关闭了NUnit 2.x支持,即使它显然与问题无关,但这解决了问题(我使用的是ReSharper 2017.3.20180201.111630)


0
我们在测试中使用TestCaseSource。 因此,对于我在Rider版本2021.1.3中的修复方法是将Build-->Unit Testing-->NUnit更改为Test Runner enter image description here


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