在 NCrunch 中运行的单元测试在 Resharper 中无法运行

5
我有一组单元测试以前在 NCrunch 和 Resharper 7(在 VS2012 中)测试运行器中非常好用。我通过 NuGet 添加了 SignalR 和 SignalR.Ninject,现在我的单元测试在 NCrunch 中工作,但不再在 Resharper 中运行。
TestFixtureSetUp 失败,出现以下错误:
SetUp : System.IO.FileLoadException : Could not load file or assembly 
'Ninject, Version=2.2.0.0,    Culture=neutral, PublicKeyToken=c7192dc5380945e7' 
or one of its dependencies. The located assembly's manifest definition does 
not match the assembly reference. (Exception from HRESULT: 0x80131040)

at ProjectName.Infrastructure.SiteResolver.BindSignalR(IKernel kernel)
at ProjectName.Infrastructure.SiteResolver.RegisterServices(IKernel kernel) in SiteResolver.cs: line 29
at ProjectName.Tests.Unit.DataTests.Init() in DataTests.cs: line 48

在App.Config中,我有

<runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity name="Ninject" publicKeyToken="c7192dc5380945e7" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

在Web.Config中的等价物在实际的MVC项目中有效。

有什么想法如何修复它?

更新

我尝试了开启和关闭影子复制,但结果没有任何区别。

更新

来自Jim Skim答案生成的日志文件输出:

*** Assembly Binder Log Entry  (15/10/2012 @ 16:43:47) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\Program Files (x86)\JetBrains\ReSharper\v7.0\Bin\JetBrains.ReSharper.TaskRunner.CLR4.MSIL.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = ######\simon
LOG: DisplayName = Ninject, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7
 (Fully-specified)
LOG: Appbase = file:///Z:/ProjectName/ProjectName.Tests.Unit/bin/Debug
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ProjectName.Tests.Unit
Calling assembly : ProjectName.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: Z:\ProjectName\ProjectName.Tests.Unit\bin\Debug\ProjectName.Tests.Unit.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Ninject, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///Z:/ProjectName/ProjectName.Tests.Unit/bin/Debug/Ninject.DLL.
LOG: Assembly download was successful. Attempting setup of file: Z:\ProjectName\ProjectName.Tests.Unit\bin\Debug\Ninject.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Ninject, Version=3.0.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

1
Visual Studio 的哪个版本?R# 的哪个版本? - bryanbcook
1
Resharper 7(在VS2012中)。更新的问题;谢谢。 - harriyott
1
据说VS2012更新1已经修复了这个bug,因此程序集绑定重定向现在应该可以在单元测试项目中工作。 - Mark Melville
3个回答

6
我没有具体的答案,但在追踪这种问题时,我使用Fusion日志查看器。打开Visual Studio命令提示符并运行 如果您之前没有做过这个,则禁用记录,进入设置并将其设置为。如果发现它最初没有显示任何日志,请尝试以管理员模式启动命令提示符。
我最近遇到了类似的问题,这个工具帮我解决了问题,但有趣的是,在Resharper中通常总是能正常运行。
解决方案几乎总是绑定问题,所以您来对地方了。

1
完成了,但是日志查看器中没有任何内容。 - harriyott
2
当你查看日志时,它是一个相当喜怒无常的野兽,请不要以管理员身份运行它,日志存储在本地用户文件夹的某个位置,因此如果管理员用户不是您通常的登录用户,则可能由于此原因未显示日志。 - James Skimming
1
好的,谢谢。我已经在问题中发布了日志。不太确定该怎么处理。 - harriyott
1
希望我能再加2分,因为你实际上建议使用fuslogvw.exe - 这是一个我很少看到被用于解决顽固的程序集加载错误的工具。非常好的建议。 - J0e3gan

3
似乎在VS2012中存在一个错误,除非使用testsettings文件,否则无法捕获绑定重定向http://youtrack.jetbrains.com/issue/RSRP-329746。无论你使用哪种测试框架,只需右键单击解决方案并添加新的testsettings文件。默认情况下,此文件为空,这正是您需要的。从那里开始,您只需要将其标记为活动测试设置(工具->测试->选择活动测试设置->文件名)。更新:根据此链接:http://youtrack.jetbrains.com/issue/RSRP-329567,似乎人们已经能够通过R#7.1使此解决方法起作用。

1
我应该指出,从VS的角度来看,当您添加一个mstest项目时,测试设置总是会添加到解决方案中,因此这并不是一个真正的错误... - bryanbcook
1
谢谢你回答,Bryan。我已经尝试过这个方法,但结果没有改变。 - harriyott
1
人们在上面的链接中评论说,这在7.1 EAP版本(10月8日)中有效。 - bryanbcook
1
刚刚安装了Build 7.1.7.40(10月16日发布),没有任何变化。 - harriyott
我在我的VS2012中找不到(工具->测试->选择活动测试设置->文件名),但是找到了菜单:测试->测试设置->选择测试设置文件->文件名。顺便说一句。 - LosManos
另外:我不得不将mysolution.vsmdi文件添加到解决方案项中。VS2012说它已被弃用,但我仍然需要它。(VS2012、Dotnet4、R#7.1.3) - LosManos

2

这个链接(最初由@bryanbcook提到),虽然Resharper 7.1升级失败了,但其中一位评论者发布了一些代码来强制解决。我已经在我的单元测试基类中填写了空白部分:

public class UnitTestBase
{
    static DataTests()
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainAssemblyResolve;
    }

    public static Assembly CurrentDomainAssemblyResolve(
        object sender, ResolveEventArgs args)
    {
        var name = new AssemblyName(args.Name);
        return name.Name == "Ninject" 
            ? typeof(KernelBase).Assembly : null;
    }
}

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