13

アセンブリにapp.configファイルが含まれている場合、ConfigurationManagerそれがNUnit-Guiを介して実行されているNUnitプロジェクトと同じディレクトリにある限り、それをロードします。説明のために、次のフォルダ構造を検討してください。

+ TestFolder
    testProject.nunit
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config

AssemblyAとを呼び出す両方のAssemblyBコードを実行しますConfigurationManager。これらのテストアセンブリをNUnit-Guiで個別に実行ConfigurationManagerすると、ローカル構成ファイルが正しく解決されます。

ただし、testProject.nunitNUnit-Gui(との両方への参照を含む)にロードするAssemblyAAssemblyB、現在実行中のアセンブリConfigurationManagerに関係なく、で構成ファイルを検索します。TestFolder

現在のアセンブリのディレクトリにあるものにアプリケーション構成を再ロードするようにNUnitに指示する方法はありますか?

内容は次のtestProject.nunitとおりです。

<NUnitProject>
  <Settings activeconfig="Debug" />
  <Config name="Debug" binpathtype="Auto">
    <assembly path="AssemblyAFolder\assemblyA.dll" />
    <assembly path="AssemblyBFolder\assemblyB.dll" />
  </Config>
</NUnitProject>
4

5 に答える 5

5

Nunitは、プロジェクト内のApp.configファイルのパスを見つけることができません。したがって、App.configファイルがプロジェクト内のどこに配置されているか(明らかにルートフォルダー上)をNunitに手動で通知する必要があります。

私の場合、プロジェクトの構造は次のとおりです。

     +ProjectWEBApp//web pages
       +Modules
         +aspx pages
       +web.Config

    +projectBusinesslogic //business logic .cs files
       +Modules
         +.cs

      +ProjectTestName// a seperate Nunit test cases project
        +Modules
      +App.Config

ProjectWebAppは、ビジネスロジックを含むprojectBusinesslogicの参照を使用します。+ ProjectTestNameは、projectBusinesslogicの参照を使用して、ビジネスロジックのテストを実行します。問題はここから始まります。Nunitテストプロジェクトには独自のapp.configファイルが必要です。projectBusinesslogicの場合のようにweb.configファイルを使用しないため、Nunitを実行するとエラーが発生します

-Null参照例外.......オブジェクトインスタントが..........に設定されていません

解決策-NunitGUIを実行する場合

  1. プロジェクト->新しいポップアップの編集が開きます
  2. [プロパティ]->[一般]->[構成ファイル名]->app.configファイル名を追加ます
  3. ファイル->ポップアップウィンドウを保存して閉じます
  4. ONNunitGui-ファイル->プロジェクトのリロード

それがあなたの問題の簡単な解決策です

于 2012-03-14T06:50:18.990 に答える
3

MarkLawrenceによって提供された要素ソリューションconfigSource、私が探していたものであり、うまく機能します。ただし、このソリューションを実装する際の課題は、明示的なNUnitプロジェクト(私の場合のように)からテストを実行するときと、アセンブリの単体テストを分離して実行するとき(明示的なプロジェクトなし)の両方でアセンブリ構成をロードすることです。これを実現するには、ファイルレイアウトに次の変更を加える必要がありました。

+ TestFolder
    testProject.nunit
    testProject.config
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
      assemblyA.dll.configfragment
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config
      assemblyB.dll.configfragment

ファイルは、configfragment対応するファイルにかつてあったアセンブリ構成を含むように作成されconfigます。その後、ファイルは、対応するファイルへの相対パスを持つ要素configのみを含むように変更されます。このアプローチが機能しないのは、作成時に競合が発生するため、両方が同じ構成セクションを必要とする場合のみであることに注意してください。configSourceconfigfragmentassemblyA.dllassemblyB.dlltestproject.config

このアプローチを試した後、実行時にアセンブリ構成を生成することに依存し、静的構成ファイルをすべて一緒に削除することにしました。これは、構成を生成し、テスト対象のアセンブリがどのようにロードされているかに関係なく構成にアクセスできるようにする方法を示すコードです。

void WithConfigurationFile(Action method)
{
    // Create the assembly configuration.
    string settingsSection = "myConfigSectionName";
    Configuration config =
        ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.Sections.Add(
        settingsSection,
        new ConfigSectionType(/*config element values*/);
    config.Save();

    try
    {
        // Invoke the method with the new configuration.
        ConfigurationManager.RefreshSection(settingsSection);
        method();
    }
    finally
    {
        // Revert the assembly configuration.
        File.Delete(config.FilePath);
        ConfigurationManager.RefreshSection(settingsSection);
    }
}

パスを受け入れないConfigurationManager.OpenExeConfiguration()オーバーロードを使用することにより、ホストアプリケーションの作業ディレクトリから構成をロードします。このディレクトリは、NUnitテストの実行方法によって異なります。また、try / finalブロックは、アセンブリ構成が他のテストに干渉しないことを保証します。他のテストでは、そのような構成が必要な場合と不要な場合があります。

最後に、単体テスト内で使用するには:

[Test]
void VerifyFunctionality
{
    WithConfigurationFile(delegate
    {
        // implement unit test and assertions here
    });
}

これが同様の問題に遭遇した可能性のある他の人に役立つことを願っています!

于 2009-09-19T18:53:30.453 に答える
2

NUnitブログでは、構成ファイルがそのようにロードされる理由について説明しています。基本的に彼らが言ったことは、NUnitはフレームワークに設定ファイルを処理させ、管理は一切行わないということでした。

testProject.configケースでロードされるファイルを使用して、各アセンブリの構成ファイルを参照することもできます。appSettingsファイル属性を使用してキーを追加します。

最後の方法の1つは、configSourceelement属性を使用して、アセンブリ構成ファイルの1つにあるセクションを使用することです。

お役に立てれば。

于 2009-09-13T01:55:11.433 に答える
2

.nu​​nitファイルの構成レベルでconfigfile属性を使用します。


<Config name="Debug" configfile="myconfigfilenamegoeshere.config />

于 2010-03-23T05:33:36.963 に答える
0

実際、Visual Studio内でNUnitとランナーを使用している場合は、テストプロジェクトのApp.configに値を固定できます。次に、ビルド後のイベントに次の行を追加します。

/ Y“ $(ProjectDir)App.config”“ $(TargetDir)$(TargetFileName).config”</p>をコピーします

テストでConfigurationManagerにアクセスすると、NUnitはapp.configの値をinitializeメソッドで.Netに渡します。

于 2014-07-30T18:51:58.867 に答える