0

RhinoMocks と Moles の両方を使用するテスト方法を開発しています。必要に応じて、テスト メソッドのホスト タイプを Moles として宣言しました。RhinoMocks がインターフェイスのモックを作成するためにランタイム アセンブリを発行しなければならない時点になると、FileNotFoundException がスローされ、プライベート DLL の 1 つがポイントされます。これは実際には、テスト DLL および DLL と同じフォルダーに存在します。テスト中のクラスを含みます。

しかし、HostType 属性を削除すると、モック インスタンスの作成は例外なく正常に機能します。

そのため、次の手順を使用して、Moles ホスト タイプでこれを機能させるための回避策を作成しました。

1) [TestInitialize] で AppDomain.CurrentDomain.AssemblyResolve イベントに登録しました

2) イベント ハンドラーに、次のロジックを詰め込みました。

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string asmPath = Environment.CurrentDirectory + "\\" + args.Name.Split(',')[0] + ".dll";
        if(System.IO.File.Exists(asmPath))
            return System.Reflection.Assembly.Load(new System.Reflection.AssemblyName(args.Name));
        return null;
    }

これで、予想どおり、Moles HostType でテストが実行されると、このアセンブリ リゾルバーが呼び出されます。テストが実行されます。

しかし、まだ疑問は次のとおりです。

1) AppDomain の APPBASE パスを、すべての運用 DLL とテスト DLL を含むフォルダーに明示的に設定したとしても、別のアセンブリ リゾルバーが必要なのはなぜですか?

AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory);

ここで、現在のディレクトリが実際にテスト DLL を含むすべてのバイナリを見つけることができる私の bin フォルダーであることを確認しました。

2) 同じ依存関係が関係している他のプロダクション DLL をテストしているときに、このエラーが発生しないのはなぜですか。

3) この問題は、NMock2 を使用しているときにも発生します。これは、RhinoMocks 固有の問題であるかどうかを確認するためだけに試みました。しかし、NMocks2 でさえ、RhinoMocks と同じ依存 DLL を使用して、Reflection.Emit ステップで同じ問題を抱えていることが判明しました。これを説明する方法はありますか?

4

1 に答える 1

0

欠けている部分は、単体テストを実行すると、実行中のアプリは単体テストがアプリケーションをホストすることです。そのアプリケーションの CurrentDirectory は、おそらくそのランナーがインストールされているディレクトリです。アセンブリは、パラメーターと共にアプリケーションに渡されます。

CurrentDirectory がアプリケーションのディレクトリであるという仮定には誤りがあります。これにより、ポイント 1、2、および 3 が説明されます。

于 2012-05-15T08:21:21.550 に答える