Resharper从不同的位置运行UnitTest

时间:2013-04-26 07:36:33

标签: unit-testing visual-studio-2012 nunit resharper .net-assembly

当我使用Visual Studio运行单元测试时,它工作正常,因为它从所有程序集所在的项目目录运行。 但是当我使用resharper 运行它时,它会出错

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

有错误

  

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

所以我试过

var path = Assembly.GetExecutingAssembly().Location;

并不是第一个项目。这是

  

C:\用户\ *用户名* \应用程序数据\本地\ TEMP \ TestResults \ ... \缺货\

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

它发生在单元测试中,但不适用于NUnit,任何想法?

10 个答案:

答案 0 :(得分:44)

Resharper shadow会复制程序集以进行默认测试。如果关闭卷影复制,它将在bin文件夹中运行,测试应该通过。 Here是关于关闭它的一些说明。

答案 1 :(得分:26)

documentation for NUnit的Gui Test Runner设置中有关于卷影复制的以下注释

  

注意:如果您想要禁用卷影副本以访问与程序集相同的目录中的文件,您应该知道有其他选择。请考虑使用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;
    }

答案 2 :(得分:12)

我遇到了同样的问题,resharper测试运行器在C:\中,而实际构建的dll和解决方案在另一个驱动器上。解决方案是解开"使用Legacy Runner"在resharper选项的MSTest设置页面中。

答案 3 :(得分:4)

尝试创建testsettings文件,并配置deployment rules for your tests

旧版本的resharper似乎有some bugs when processing deployment of folders,我认为它是fixed in latest version of resharper 7

答案 4 :(得分: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 )
}

答案 5 :(得分:2)

您正在使用Assembly.Load()动态加载程序集。可能是您缺少对要加载的程序集的引用。否则,阴影复制可能会错过未引用的程序集。

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

答案 6 :(得分:1)

只需完成mcdon的非常有用的回答,使用assembly.Location根据MSFT的说明给出正确答案:

  

CodeBase 是找到文件的地方的网址,而   位置是实际加载的路径。例如,   如果程序集是从互联网上下载的,它的CodeBase可能会   以“http://”开头,但其位置可能以“C:\”开头。如果   文件被复制了阴影,Location将是复制的路径   阴影副本目录中的文件。

     

知道CodeBase不能保证设置也很好   适用于GAC的程序集。将始终为装配设置位置   但是从磁盘加载。

因此我会使用以下内容:

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

答案 7 :(得分:1)

只需更改当前目录

即可
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;

// or
Directory.SetCurrentDirectory(dir);

https://github.com/nunit/nunit/issues/1072

答案 8 :(得分:0)

为我解决的是设置"复制本地"在测试项目中的nunit.framework.dll引用上将属性设置为true。

答案 9 :(得分:0)

如果在禁用“阴影构建”后运行并构建问题 您必须首先从Build选项中选择“Clean all”,然后在“shadow build”上构建项目禁用