48

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

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

有错误

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

所以我试过了

var path = Assembly.GetExecutingAssembly().Location;

这不是项目一。它是

C:\Users\*用户名*\AppData\Local\Temp\TestResults\...\Out\

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

它发生在单元测试中,但没有发生在 NUnit 中,有什么想法吗?

4

10 回答 10

44

默认情况下,Resharper 影子副本程序集用于测试。如果您关闭卷影复制,它将在 bin 文件夹中运行并且测试应该通过。 这里有一些关于关闭它的说明。

于 2013-04-30T03:07:24.857 回答
26

在 NUnit 的 Gui Test Runner 设置的文档中,有以下关于 Shadow Copy 的注释

注意:如果您想禁用卷影复制以访问与您的程序集位于同一目录中的文件,您应该知道还有其他选择。考虑使用 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;
    }
于 2014-09-04T18:14:40.633 回答
12

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

于 2013-07-18T02:07:48.637 回答
3

尝试创建一个 testsettings 文件,并为您的测试配置部署规则

旧版本的 resharper 在处理文件夹部署时似乎有一些错误,我认为它已在最新版本的 resharper 7 中修复

于 2013-04-30T18:17:46.763 回答
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 )
}
于 2015-08-18T14:34:43.337 回答
2

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

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

于 2013-04-30T09:22:27.863 回答
2

只是为了完成非常有用的答案mcdon,使用assembly.Location根据MSFT的解释给出正确答案:

CodeBase是指向文件所在位置的 URL,而 Location实际加载文件的路径。例如,如果程序集是从 Internet 下载的,则其 CodeBase 可能以“http://”开头,但其 Location 可能以“C:\”开头。如果文件是影子复制的,则 Location 将是影子复制目录中文件副本的路径。

还很高兴知道,不能保证为 GAC 中的程序集设置 CodeBase。但是,将始终为从磁盘加载的程序集设置位置。

因此我会使用以下内容:

public static DirectoryInfo GetAssemblyDirectory()
{
    var assembly = Assembly.GetExecutingAssembly();    
    return new DirectoryInfo(Path.GetDirectoryName(assembly.Location));
}
于 2016-06-22T08:54:10.313 回答
1

只需更改当前目录

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

// or
Directory.SetCurrentDirectory(dir);

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

于 2017-09-16T20:32:13.873 回答
0

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

于 2016-11-27T17:25:30.137 回答
0

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

于 2016-11-07T04:50:40.127 回答