web-dev-qa-db-ja.com

Resharperは別の場所からUnitTestを実行します

Visual Studioで単体テストを実行すると、すべてのアセンブリがあるプロジェクトディレクトリから実行されるため、正常に動作します。 ただし、resharperで実行するとエラーが発生します

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

エラーあり

ファイルまたはアセンブリ 'SomeAssembly'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません..

だから私は試した

var path = Assembly.GetExecutingAssembly().Location;

そして、それはプロジェクト1ではありません。それは

C:\ Users\* UserName *\AppData\Local\Temp\TestResults\...\Out \

'SomeAssembly'はありません。再シャーパーを正しく構成する方法、またはVisual Studioのようにすべてのアセンブリを収集するにはどうすればよいですか?

それは単体テストで発生しますが、NUnitでは発生しません、何かアイデアはありますか?

48
Roar

Resharperシャドウは、デフォルトでテスト用にアセンブリをコピーします。シャドウコピーをオフにすると、binフォルダーで実行され、テストに合格するはずです。 ここ オフにするためのいくつかの指示があります。

44
tallseth

NUnitのGuiテストランナー設定の ドキュメント には、シャドウコピーに関する次の注意事項があります。

注:アセンブリと同じディレクトリ内のファイルにアクセスするためにシャドウコピーを無効にしたい場合は、代替手段があることに注意する必要があります。 Assembly.LocationではなくAssembly.Codebaseプロパティの使用を検討してください。

Assembly.Codebaseプロパティの使用例を次に示します

    private string AssemblyLocation()
    {
        var Assembly = Assembly.GetExecutingAssembly();
        var codebase = new Uri(Assembly.CodeBase);
        var path = codebase.LocalPath;
        return path;
    }
26
mcdon

私は同じ問題を抱えていました。resharperテストランナーはC:\にありましたが、実際のビルドされたdllとソリューションは別のドライブにありました。解決策は、リシャーパーオプションの[MSTest設定]ページで[レガシーランナーを使用する]をオフにすることでした。

12
sinaptik

Testsettingsファイルを作成して、 テストの展開ルール を構成してください。

Resharperの古いバージョンには フォルダの展開を処理する際のいくつかのバグ があるようです。 resharper 7の最新バージョンに修正済み と思います。

4
Alexander

このコードをロードしてみてください(以下を参照)。テストランナーとは無関係にアセンブリを検索します。

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 )
}
3
Manushin Igor

Assembly.Load()を使用して、アセンブリを動的にロードしています。ロードするアセンブリへの参照が欠落している可能性があります。そうしないと、シャドウコピーで参照されていないアセンブリが失われる可能性があります。

これらのアセンブリを参照したくない場合は、プロジェクトにそれらを含めて、出力ディレクトリにコピーしてください。これを行うには、「出力ディレクトリにコピー」プロパティを設定するか、カスタムのビルド後ステップを作成します。

2
Dio F

現在のディレクトリを変更するだけです

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

// or
Directory.SetCurrentDirectory(dir);

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

1
RouR

mcdonから非常に役立つ答えを完成させるために、Assembly.Locationを使用して、 [〜#〜] msft [〜#〜] の説明に従って正しい答えを与えます。

CodeBaseはファイルが見つかった場所へのURLであり、Locationは、実際にロードされた場所からのパスです。たとえば、アセンブリがインターネットからダウンロードされた場合、CodeBaseは「http://」で始まりますが、Locationは「C:\」で始まります。ファイルがシャドウコピーされた場合、Locationはシャドウコピーディレクトリ内のファイルのコピーへのパスになります。

CodeBaseがGACのアセンブリに設定されることを保証されていないことも知っておくと良いでしょう。ただし、ディスクからロードされたアセンブリの場所は常に設定されます。

したがって、次のものを使用します。

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

私にとってそれを解決したのは、テストプロジェクトのnunit.framework.dll参照で「ローカルコピー」プロパティをtrueに設定することでした。

0
HS1

「シャドウビルド」を無効にした後に問題を実行してビルドした場合は、最初に「ビルド」オプションから「すべて消去」を選択し、その後「シャドウビルド」を無効にしてプロジェクトをビルドする必要があります

0
user7216927