テストにはXunitを使用しています。 Xunitプラグインを使用して、組み込みのVisual Studio 2013テストランナーを介してテストを実行しています。
問題は、一部のテストでファイルシステム上のファイルを参照する必要があることです。 Xunit(またはVS Test Runner —どちらかわからない)は、テストを実行する前に、binディレクトリ内のサポートファイルを別のディレクトリにコピーしますが、テストファイルが見つかりません。 [MS Testingフレームワークは、コピーするリストファイルの属性を指定しますが、Xunitは指定しません。]
どのようにどちらかこのコピー動作を無効にするか、プログラムで元のbin/
ディレクトリの場所を決定してファイルをフェッチするには?
ほとんどの提案されたソリューション(Xunitバグトラッカーサイトを含む)は、「常にコピー」ファイルではなく、埋め込みリソースとしてファイルを保存することを推奨しているようです。ただし、これは常に実用的であるとは限りません。たとえば、ファイル操作コードのテストや、(1つの場合では)Sqliteデータベースファイルを必要とするコードです。
さて、典型的には、質問を投稿するとすぐに、自分で答えを見つけます…
要点は、アセンブリのコピー(シャドウコピー)は、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);
…ここで、relativePath
はBin\
ディレクトリへの相対パスです。
少し検索した後、私はここで解決策を見つけました: https://msdn.Microsoft.com/en-us/library/ms182475.aspx 。
特に、最初のステップは私にとって十分でした:
それらが1つのテストプロジェクトに固有のものである場合は、それらをVisual Studioテストプロジェクトのコンテンツファイルとして含めます。ソリューションエクスプローラーでそれらを選択し、[出力にコピー]プロパティを[新しい場合はコピー]に設定します。
次のコードに関連付けられています:
var filename = "./Resources/fake.pdf"
File.OpenRead(filename)
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のディレクトリからの相対パスです。
ディレクトリを特定してファイルをコピーしようとするのに苦労した後(複数のディレクトリが機能していて、正しいディレクトリを特定するのは難しいようです)、シャドウコピーをオフにするだけでよいことがわかりました。その時点で、ユニットはbin/{configuration}フォルダー内の参照コンテンツを再度テストします。
そのためには、指示 ここ に従います。 shadowCopy
をfalseに設定するのと同じくらい簡単なようです:
{
"shadowCopy": false
}
この設定が他の設定(appDomain
など)と悪影響を及ぼしているかどうかは不明です。誰かが知っていれば、あなたのコメントは大歓迎です。