【问题标题】:Resharper runs UnitTest from different locationResharper 从不同的位置运行 UnitTest
【发布时间】:2013-04-20 07:28:56
【问题描述】:

当我使用 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 不会发生这种情况,有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 它发生在单元测试中,但没有发生在 nunit 中,那么有什么不同,有什么想法吗? @tallseth
    • 当您说“单元测试,但不使用 nunit”时,您是什么意思?你是说MSTest吗?还是说它适用于 nunit 控制台运行程序,但不适用于 resharper 插件,并且所有测试都使用 nunit 框架?
    • 是的,当我用 resharper 运行 MSTest 时它失败了,但是当我用 TestExplorer 运行 MSTest 时它运行正常,当我用 resharper 运行 NUnit 时它运行良好 t00
    • 我已禁用卷影复制,但仍然遇到同样的问题。如果我从测试资源管理器运行它,它可以工作,但不是通过 Resharper。
    • 那么如果是nunit测试,它在所有情况下都运行良好,而mstests不行?停止使用 mstext,切换到 nunit。这是一个指南:knot.org/scottlaw/blog/?p=404
    【解决方案2】:

    在 NUnit 的 Gui Test Runner 设置的 documentation 中有以下关于 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;
        }
    

    【讨论】:

    • 来到TestContext.CurrentContext.TestDirectory。我现在在 NUnit 3.0 中使用它。我不知道多久以前 TestContext.CurrentContext.TestDirectory 可用。
    • 您应该将 TestContext 解决方案添加为不同的答案,因为它本身就是一个很好的答案。我会投票给它。这在 NUnit 2.6 中也确实有效,我认为一般是 2.x 版本。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      老版本的resharper好像有some bugs when processing deployment of folders,我觉得是fixed in latest version of resharper 7

      【讨论】:

      • 遗憾的是,Resharper 7.1.3 和 VS 2012 没有修复它
      【解决方案5】:

      尝试使用此代码进行加载(见下文)。它将独立于测试运行程序查找程序集。

      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 )
      }
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 我引用了所需的程序集,如果 NUnit 测试它工作正常,但不适用于默认 Visual Studio 测试 Microsoft.VisualStudio.TestTools.UnitTesting;
        • 目前不知道。顺便说一句:Microsoft.VisualStudio.TestTools.UnitTesting 功能通常被称为“MSTest”。也许这有助于获得更好的搜索结果。
        【解决方案7】:

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

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

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

        因此我会使用以下内容:

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

        【讨论】:

          【解决方案8】:

          只需更改当前目录

          var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
          Environment.CurrentDirectory = dir;
          
          // or
          Directory.SetCurrentDirectory(dir);
          

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-12-05
                • 2013-12-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多