web-dev-qa-db-ja.com

.NET CoreコンソールアプリのNUnit3でapp.configファイルを使用する

環境:

現在、私のソリューションには3つのプロジェクトがあります。

  • テストしたいコードを含む.NET Standard 2.0ライブラリ。
  • ライブラリを参照して動作することを確認する.NET Core 2.2コンソールアプリ。
  • VSの「NUnit Test Project」テンプレートを使用して作成された.NET Core 2.2コンソールアプリ。

私のテストプロジェクトの依存関係はすべてNuGetによるものです。

  • Moqバージョン= "4.10.1"
  • nunit "バージョン=" 3.11.0 "
  • NUnit.ConsoleRunner "バージョン=" 3.10.0 "
  • NUnit3TestAdapter "バージョン=" 3.13.0 "
  • Microsoft.NET.Test.Sdk "バージョン=" 16.0.1 "

問題:

.NET標準ライブラリは、それを使用するすべてのアプリケーションに存在するapp.configファイルに依存しています。 ConfigurationSection および ConfigurationElement 属性を使用して、値をクラスにマッピングします。これは、この回答と非常によく似ています。 ネストされたコレクションを持つカスタム構成セクション

.NET Coreコンソールアプリにはapp.configファイルが含まれており、ライブラリはその中の値を正常に解析して使用できます。わーい。

一方、NUnitコンソールアプリには同じapp.configファイルが含まれていますが、ライブラリからは見えません。 ConfigurationManager.GetSection("...")を使用して値を読み取ろうとするとすぐに、nullが返されます。

このような環境でNUnit3を使用するためにapp.configファイルを取得した人はいますか?


私が試したこと:

それはそれは設定ファイルをサポートします のように見えますですが、ドキュメントが特別なNUnit設定ファイルまたはapp.configファイルを参照しているかどうかはわかりません。

  • App.configの名前をmy_test_project_name.dll.configに変更してみました
  • 設定ファイルの「出力ディレクトリにコピー」設定を「常にコピー」に設定しました
  • (app.config、App.config、my_test_project_name.config、my_test_project_name.dll.config、etc)

また、これまでに書いた1つのテストで、AppDomain.CurrentDomain.SetData()を使用するよう提案するなど、なんらかの方法で構成ファイルを設定しようとしました(NUnit3が機能しないために機能しませんでした) t AppDomainをサポート):

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Path\To\My\Tests\my_test_project_name.dll.config");

NUnit3で設定ファイルを使用することは可能です を示唆するように見えるNUnitリポジトリ内のテストがありますが、その特定のテストファイルは 。NET 4.5デモプロジェクト でのみ参照されます、 。NET Coreデモプロジェクト ではありません。

14
vivat pisces

単体テスト内で次の行を実行してその結果を調べると、NUnitプロジェクトがtesthost.dll.configという構成ファイルを探していることがわかります。

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;

パスが短縮されましたClassLibrary1\NUnitTestProject1\bin\Debug\netcoreapp2.2\testhost.dll.config

これにより、ASP.NET Core 2.2とNUnit Test Projectテンプレートで構成ファイルを使用する方法の例を作成しました。また、設定ファイルのCopy to Output Directory設定がCopy alwaysに設定されていることを確認してください。

UnitTest.cs

public class UnitTest
{
    private readonly string _configValue = ConfigurationManager.AppSettings["test"];

    [Test]
    public void Test()
    {
        Assert.AreEqual("testValue", _configValue);
    }
}

testhost.dll.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="test" value="testValue" />
  </appSettings>
</configuration>
13
prd

1つのプロジェクトの場合testhost.dll.configは正常に機能しています。
別のプロジェクトでは、testhost.x86.dll.config

(prd)からのソリューションは、使用されている実際のパスを確認するのに非常に役立ちました

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;

https://github.com/dotnet/corefx/issues/22101

App.configを正しい名前でコピーします

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
  <Copy SourceFiles="app.config" DestinationFiles="$(OutDir)\testhost.dll.config" />
</Target>
<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\testhost.x86.dll.config" />
</Target>

これは別の興味深い解決策でした

<None Update="App.config">
  <Link>testhost.x86.dll.config</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
1
Nathan Smith