47

当我使用Visual Studio运行单元测试时,它工作正常,因为它从所有程序集所在的项目目录运行。 但是,当我与ReSharper的运行它,它用错误的推移Resharper从不同位置运行UnitTest

var services = Assembly.Load("SomeAssembly"); 

错误

无法加载文件或程序集“SomeAssembly”或它 的一个依赖。该系统找不到指定的文件..

所以我已经试过

var path = Assembly.GetExecutingAssembly().Location; 

,它不是一个项目。这是

C:\用户\ *用户名* \应用程序数据\本地的\ Temp \ TestResults \ ... \输出\

并没有'SomeAssembly'。如何正确配置resharper或收集像Visual Studio一样的所有程序集?

它发生在单元测试,但没有与NUnit,任何想法?

回答

41

默认情况下,Resharper Shadow会复制用于测试的程序集。如果关闭阴影复制,它将运行在bin文件夹中,并且测试应该通过。 Here是关闭它的一些说明。

+0

正好与单元测试,但不能与NUnit的,所以有什么不同,任何想法? @tallseth – Roar 2013-04-30 06:24:28

+0

当你说“单元测试,但不与nunit”时,你是什么意思?你的意思是MSTest?或者你的意思是它可以与nunit控制台运行程序一起使用,但不是使用resharper插件,并且所有测试都使用nunit框架? – tallseth 2013-05-01 04:14:14

+0

是的,当我运行MSTest与resharper它失败,但是当我运行与TestExplorer的MSTest运行正常,当我运行NUnit与resharper它运行良好t00 – Roar 2013-05-01 06:55:55

2

您正在使用Assembly.Load()动态加载您的装配。可能是你缺少一个加载程序集的引用。否则,阴影复制可能会漏掉未引用的程序集。

如果您不想引用这些程序集,请确保将它们包含在您的项目中并将它们复制到输出目录中。您可以通过将“复制到输出目录”属性或创建自定义构建后步骤来执行此操作。

+0

我参考需要的程序集,它工作正常,如果NUnit测试,但不适用于默认Visual Studio测试Microsoft.VisualStudio.TestTools.UnitTesting; – Roar 2013-04-30 09:29:14

+0

目前还不知道。顺便说一句:Microsoft.VisualStudio.TestTools.UnitTesting功能通常被称为“MSTest”。也许这有助于获得更好的搜索结果。 – 2013-04-30 10:44:23

12

我有同样的问题,resharper测试运行器是在C:\而实际的内置dll和解决方案是在另一个驱动器上。解决方案是在resharper选项的MSTest设置页面中取消选中“Use Legacy Runner”。

+2

谢谢你,你救了我很多痛苦! – 2013-12-16 05:51:39

25

documentation为NUnit的GUI的测试运行器设置有大约影复制

注意以下注意事项:如果你被诱惑,以获得在同一目录文件作为组件禁用卷影副本,你应该知道有其他选择。考虑使用Assembly.Codebase属性而不是Assembly.Location。

以下是使用Assembly的示例。Codebase属性

private string AssemblyLocation() 
    { 
     var assembly = Assembly.GetExecutingAssembly(); 
     var codebase = new Uri(assembly.CodeBase); 
     var path = codebase.LocalPath; 
     return path; 
    } 
+9

来到[TestContext.CurrentContext.TestDirectory](https://github.com/nunit/docs/wiki/TestContext#testdirectory)。我现在在NUnit 3.0中使用它。我不知道TestContext.CurrentContext.TestDirectory可用的时间有多远。 – mcdon 2016-07-05 18:47:58

+0

您应该添加TestContext解决方案作为不同的答案,因为它本身就是一个很好的答案。我会为此投票。 这也在NUnit 2.6中工作,我认为一般来说2.x版本。 – Holf 2016-12-09 10:44:51

3

试试这个代码的加载(见下文)。它将查找独立于测试运行程序的程序集。

private static string[] assemblyLookupPath = new[] 
{ 
    AppDomain.CurrentDomain.BaseDirectory, 
    Environment.CurrentDirectory, 
    Assembly.GetExecutingAssembly().Location 
}.Distinct().ToArray(); 

public static void Assembly Load(string fileName) 
{ 
    var filePath = assemblyLookupPath 
     .Select(f=>Path.Combine(f, fileName)) 
     .Where(File.Exists) 
     .FirstOrDefault(); 

    /*do here null checks and raise errors, write logs, etc*/ 

    return Assembly.LoadFrom(filePath) 
} 
1

刚刚从mcdon完成非常有帮助的答案,使用assembly.Location给出了正确的答案,因为每个MSFT的解释:

基本代码是一个URL到源文件所在的地方发现,而 位置是实际加载的路径。例如,如果程序集是从互联网上下载的,则其代码库 可能以 开头为“http://”,但其位置可能以“C:\”开头。如果 文件被阴影复制,则该位置将作为影子副本目录中文件 副本的路径。

很高兴知道CodeBase不能保证在GAC中为组件设置 。然而,从磁盘加载的组件 的位置将始终设置。

所以我会用以下内容:

public static DirectoryInfo GetAssemblyDirectory() 
{ 
    var assembly = Assembly.GetExecutingAssembly();  
    return new DirectoryInfo(Path.GetDirectoryName(assembly.Location)); 
} 
0

什么解决了这个问题对我来说是设置了“复制本地”属性设置为true在测试项目中的nunit.framework.dll中参考。

0

如果已经运行和“影子构建” 的停用后,建立问题,必须首先选择从构建选项“清理所有”,之后建立在你的项目的“影子打造”禁用