单元测试在NCrunch中运行但不在Resharper中运行

时间:2012-10-15 13:33:59

标签: c# unit-testing resharper signalr ncrunch

我有一套单元测试,曾经在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.

3 个答案:

答案 0 :(得分:6)

我没有具体的答案,但在追踪此类问题时,我使用的是Fusion日志查看器。打开Visual Studio命令提示符并运行fuslogvw.exe

如果您在禁用日志记录之前尚未执行此操作,请进入设置并将其设置为Log binding failures to disk。如果您发现它最初没有显示任何日志,请尝试在管理模式下启动命令提示符。

我最近遇到过这样的问题,正是这个工具为我解决了这个问题,尽管有趣的是它通常在Resharper中有效。

解决方案几乎总是一个绑定问题,所以你在正确的位置。

答案 1 :(得分:3)

VS2012中似乎存在一个错误,除非您使用的是testsettings文件http://youtrack.jetbrains.com/issue/RSRP-329746

,否则它无法获取绑定重定向

无论您使用哪种测试框架,只需右键单击解决方案并添加新的testsettings文件即可。默认情况下,这是空的,这是您需要的。从那里你需要做的就是将其标记为有效测试设置(工具 - &gt;测试 - &gt;选择有效测试设置 - &gt;文件名称)

更新

根据此链接:http://youtrack.jetbrains.com/issue/RSRP-329567似乎人们已经能够将此解决方法与R#7.1一起使用

答案 2 :(得分:2)

this link(最初由@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;
    }
}
相关问题