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 ステップで同じ問題を抱えていることが判明しました。これを説明する方法はありますか?