12

モジュールの単体テストのために moq の実験を始めたところです。

実際、単体テストを書かなければならないクラスは

Assembly.GetExecutingAssembly().Location内部的にパスを決定します。

ただし、実行中のアセンブリのパスが異なるため、単体テストの作成中は機能しません (単体テスト アセンブリのパスが使用されます)。

AppData\\Local\\Temp\\3ylnx32t.ukg\\TestApplication.Test\\assembly\\dl3\\aeb938e6\\f3664631_d982ce01.

シャドウコピーを無効にしてみました。

AppDomainSetup appDomain= new AppDomainSetup{ShadowCopyFiles = "false",};
appDomain.ShadowCopyFiles=false.ToString();

それでも、うまくいきません!

任意の提案をいただければ幸いです。前もって感謝します。

4

4 に答える 4

18

TestContext.CurrentContext.TestDirectory ここで NUnit の Charlie Poole が述べたように使用できます。

参考:https ://stackoverflow.com/a/29057351/589574

于 2015-03-15T04:53:48.163 に答える
10

おそらくあなたの質問に対する正確な答えではないかもしれませんが、個人的にはAssembly.GetExecutingAssembly().Location、単体テスト中に の実際の値を取得しようとさえしません。私は次のようなものを作成します:

public interface IAssemblyHelper
{
    string GetLocationOfExecutingAssembly();
}

public class AssemblyHelper : IAssemblyHelper
{
    public string GetLocationOfExecutingAssembly()
    {
        return Assembly.GetExecutingAssembly().Location;
    }
}

実行時に、AssemblyHelperそれを必要とするクラスのコンストラクターにIAssemblyHelper. 単体テストでは、モックIAssemblyHelperを作成し、予想されるパスを返すように設定し、そのモックをクラスのコンストラクターに渡します。

アプリケーションで実際に実行されているアセンブリのロケーション パスでコードが機能することをテストすることは、受け入れテストの一部である必要があります。

于 2013-07-17T12:01:58.197 に答える
3

最後に、私はこの方法でこれを達成しました:

NUnit フレームワークを使用し、NUnit でシャドウ コピーを無効にしました。単体テスト ライブラリが呼び出されるディレクトリに、構成ファイルのコピーを作成しました。

したがって、単体テストが呼び出されるたびに (たとえば、パス 'A' から)、構成ファイルをパス 'A' に配置したため、アプリケーションはその場所に構成ファイルがないことを訴えません。

(ps: アセンブリの場所を取得する理由は、その場所で構成ファイルを見つけることができるようにするためです)

[全体の考え方は次のとおりです。シャドウ コピーでは、アセンブリ パスは動的です。無効にすると、アセンブリ パスは静的になります]

于 2013-08-06T09:21:46.520 に答える