web-dev-qa-db-ja.com

Visual StudioのXunitテストからテストファイルを参照する方法

テストにはXunitを使用しています。 Xunitプラグインを使用して、組み込みのVisual Studio 2013テストランナーを介してテストを実行しています。

問題は、一部のテストでファイルシステム上のファイルを参照する必要があることです。 Xunit(またはVS Test Runner —どちらかわからない)は、テストを実行する前に、binディレクトリ内のサポートファイルを別のディレクトリにコピーしますが、テストファイルが見つかりません。 [MS Testingフレームワークは、コピーするリストファイルの属性を指定しますが、Xunitは指定しません。]

どのようにどちらかこのコピー動作を無効にするか、プログラムで元のbin/ディレクトリの場所を決定してファイルをフェッチするには?

ほとんどの提案されたソリューション(Xunitバグトラッカーサイトを含む)は、「常にコピー」ファイルではなく、埋め込みリソースとしてファイルを保存することを推奨しているようです。ただし、これは常に実用的であるとは限りません。たとえば、ファイル操作コードのテストや、(1つの場合では)Sqliteデータベースファイルを必要とするコードです。

26
andrewf

さて、典型的には、質問を投稿するとすぐに、自分で答えを見つけます…

要点は、アセンブリのコピー(シャドウコピー)は、Visual StudioまたはXunitではなく.NETフレームワークによって行われているように見えることです。

アセンブリファイルを見つけるためにAssembly.Locationを使用していたため、テストファイルを見つけていました。ただし、元の代わりにシャドウコピーアセンブリの場所が表示されるため、これは誤りでした。

代わりに、Assembly.CodeBaseを使用して、ベースアセンブリコードの場所を取得する必要があります。ただし、これは(ファイル)URLであるため、URLからパスを抽出する必要があります。新しい(C#)コードは次のようになります。

var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().CodeBase);
var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath);
var dirPath = Path.GetDirectoryName(codeBasePath);
return Path.Combine(dirPath, relativePath);

…ここで、relativePathBin\ディレクトリへの相対パスです。

31
andrewf

少し検索した後、私はここで解決策を見つけました: https://msdn.Microsoft.com/en-us/library/ms182475.aspx

特に、最初のステップは私にとって十分でした:

それらが1つのテストプロジェクトに固有のものである場合は、それらをVisual Studioテストプロジェクトのコンテンツファイルとして含めます。ソリューションエクスプローラーでそれらを選択し、[出力にコピー]プロパティを[新しい場合はコピー]に設定します。

次のコードに関連付けられています:

var filename = "./Resources/fake.pdf"
File.OpenRead(filename)

The test project (note the Resource folder)Cfg of files in the resource folder

14

Macで.Net Core 1.0を実行しています。 Assembly.GetExecutingAssemblyは使用できません。代わりに次のコードを使用します。

var location = typeof(YourClassName).GetTypeInfo().Assembly.Location;
var dirPath = Path.GetDirectoryName(location);
return Path.Combine(dirPath, relativePath);

relativePathは、DLLのディレクトリからの相対パスです。

3
Tyler Long

ディレクトリを特定してファイルをコピーしようとするのに苦労した後(複数のディレクトリが機能していて、正しいディレクトリを特定するのは難しいようです)、シャドウコピーをオフにするだけでよいことがわかりました。その時点で、ユニットはbin/{configuration}フォルダー内の参照コンテンツを再度テストします。

そのためには、指示 ここ に従います。 shadowCopyをfalseに設定するのと同じくらい簡単なようです:

{
    "shadowCopy": false
}

この設定が他の設定(appDomainなど)と悪影響を及ぼしているかどうかは不明です。誰かが知っていれば、あなたのコメントは大歓迎です。

3
ket