5

NCrunchとResharper7(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.
4

3 に答える 3

6

具体的な答えはありませんが、この種の問題を追跡するときは、Fusionログビューアを使用します。Visual Studioコマンドプロンプトを開き、実行しますfuslogvw.exe

ロギングが無効になる前にこれを行っていない場合は、設定に移動してに設定しますLog binding failures to disk。最初にログが表示されない場合は、管理者モードでコマンドプロンプトを起動してみてください。

私は最近このような問題を抱えており、興味深いことに、通常はResharperで常に機能しますが、このツールが問題を解決しました。

解決策はほとんどの場合バインディングの問題であるため、適切な場所にいます。

于 2012-10-15T13:43:47.983 に答える
3

テスト設定ファイルhttp://youtrack.jetbrains.com/issue/RSRP-329746を使用していない限り、バインディング リダイレクトを取得しない VS2012 のバグがあるようです。

使用しているテスト フレームワークに関係なく、ソリューションを右クリックして新しいテスト設定ファイルを追加するだけです。デフォルトでは、これは空であり、これが必要になります。そこから、それをアクティブなテスト設定としてマークするだけです (ツール -> テスト -> アクティブなテスト設定を選択 -> ファイルの名前)。

アップデート:

このリンク: http://youtrack.jetbrains.com/issue/RSRP-329567によると、人々はこれを回避して R# 7.1 で動作させることができたようです。

于 2012-10-16T12:09:48.637 に答える
2

このリンク(@bryanbcook によって最初に言及された)から、Resharper 7.1 アップグレードは機能しませんでしたが、コメント投稿者の 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;
    }
}
于 2012-10-22T13:21:56.577 に答える