NUnit 2.6.4では、テストの作業ディレクトリは、テストDLLの対応するbin/Debug
ディレクトリに設定されていました。 これにより、相対パスによるテストで外部ファイルをロードできました。
現在、作業ディレクトリはコンソールランナーの作業ディレクトリに設定されているようです。 これは仕様によるものですか?
テストの作業ディレクトリをbin/Debug
設定したまま、コンソールランナーの作業ディレクトリにテスト結果(* .xmlファイル)を残すにはどうすればよいですか?
これは、次のように設計によるものです: https :
以前のバージョンでは、NUnitは作業ディレクトリを変更しました。 それはもはやそうしません。 TestContext.TestDirectoryを使用して、テストアセンブリを含むディレクトリを取得できます。
新しいURL: https :
これは多くのテストを破ります! なぜあなたはそれを変えたのですか? テストされたアプリのランタイムコードには、作業ディレクトリがテストアセンブリの場所であるという依存関係があったため、一部のテストを修正できません。
@imakowskiアセンブリセットアップで、現在の作業ディレクトリを既知のディレクトリに設定しようとしましたか? テストされていないコードですが、次のようなものです。
`` `C#
[SetUpFixture]
パブリッククラスMySetUpClass
{{
[OneTimeSetUp]
RunBeforeAnyTests()
{{
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;
// or
Directory.SetCurrentDirectory(dir);
}
}
`` `
@imakowskiはそれを制御できないかもしれませんが、コード/アプリケーションは設定されている現在の作業ディレクトリに依存するべきではありません。 アプリケーションは常に、上記のようなコードを使用してbinディレクトリを決定する必要があります。 Windowsには、気付かないうちに現在の作業ディレクトリを変更するAPI呼び出しがいくつかあります。 ほとんどの場合、アプリケーションは正常に実行できますが、ユーザーがアプリケーションのほとんど使用されない部分にアクセスすると失敗します。
@rprouseがシャドウコピーモードの場合、このコードは機能しませんvar dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
その場合、これを使用できます。
var dir = Path.GetDirectoryName(new Uri(typeof(MySetUpClass).Assembly.CodeBase).LocalPath);
または、TestContext.CurrentContext.TestDirectoryとして提供します。 :-)
特別な場合のためにいくつかの調整を加えて、提案されているようにURIを使用します。
または、TestContext.CurrentContext.TestDirectoryとして提供します。 :-)
CurrentContextにTestDirectoryプロパティはもうありません。 nunit3.6.1を使用しています。 私の場合、リシャーパーからテストを開始したときに間違った場所を指しているWorkDirectoryだけがあります:(
TestContext.TestDirectoryがあります。 これは静的プロパティです。 WorkDirectoryもそうだと思いますか?
まあ、私はビジュアルスタジオブラウザまたはコンパイラまたはテレリック逆コンパイラを使用してそれを見つけることができません。
しかし、私はそれをnunit3.5で見ています。 何が悪いのかわからない
私は間違っていた。
TestContext.CurrentContext.TestDirectoryです。
ただし、PORTABLEビルドにはありません。
#if !PORTABLE
/// <summary>
/// Gets the directory containing the current test assembly.
/// </summary>
public string TestDirectory
{
get
{
Assembly assembly = _testExecutionContext?.CurrentTest?.TypeInfo?.Assembly;
if (assembly != null)
return AssemblyHelper.GetDirectoryName(assembly);
#if NETSTANDARD1_6
// Test is null, we may be loading tests rather than executing.
// Assume that the NUnit framework is in the same directory as the tests
return AssemblyHelper.GetDirectoryName(typeof(TestContext).GetTypeInfo().Assembly);
#else
// Test is null, we may be loading tests rather than executing.
// Assume that calling assembly is the test assembly.
return AssemblyHelper.GetDirectoryName(Assembly.GetCallingAssembly());
#endif
}
}
#endif
3.6.0にはありますが、3.6.1にはありません。
現在のgithubリポジトリを確認していますが、上記でコピーして貼り付けたものとまったく同じです。
どういうわけかPORTABLEビルドを使用していないのですか?
はい、私はそれを使用しています
まあ、それがそこにない理由です。 私の知る限り、PORTABLEビルドではサポートされておらず、サポートされたこともありません。 ただし、PORTABLEビルドを使用したことはなく、CIテストを実行するだけです。
ありがとうございました
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
@CharliePooleと@rprouseが言ったことをまとめて、実際のコードに目を向けている人にとっては、
[SetUpFixture]
public class MySetUpClass
{
[OneTimeSetUp]
public void RunBeforeAnyTests()
{
Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
// or identically under the hoods
Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
}
}
上記のロジックを名前空間に含めないでください。 NS
using NUnit.Framework;
using System;
using System.IO;
[SetUpFixture]
public class GlobalSetup
{
[OneTimeSetUp]
public void RunBeforeAnyTests()
{
Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
// or identically under the hoods
Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
}
}
また、 TestContext.CurrentContext.TestDirectory
はコーナーケースに対処するためのインテリジェンスがいくつかあるようですので、 typeof(MySetUpClass).Assembly.Location
以上のものを選びます
typeof(MySetUpClass).Assembly.Locationよりもそれを選びます
Location
は、アセンブリがシャドウコピーされている場合、シャドウの場所を返します。通常、これは望ましくありません。 代わりにCodeBase
使用してください。これにより、シャドウコピーの前に、最初に実行された実際の場所のUri
が返されます。
明らかにTestDirectory
を使用する方が良いですが、そのプロパティに問題があるようです。#2872を参照して、キャッチできない例外を引き起こします。 OneTimeSetup
を使用した場合にも表示されるかどうかはわかりませんが(そうではないと思います)、対処するまで注意が必要です。
最も参考になるコメント
@imakowskiアセンブリセットアップで、現在の作業ディレクトリを既知のディレクトリに設定しようとしましたか? テストされていないコードですが、次のようなものです。
`` `C#
[SetUpFixture]
パブリッククラスMySetUpClass
{{
[OneTimeSetUp]
RunBeforeAnyTests()
{{
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;
}
`` `