私のアプリケーションのEndToEndテストには、releasedllを手動でロードすることが含まれます。
テスト中、私は常に次のものをロードします。-n個のデバッグアセンブリのNUnitシャドウコピー-n個のリリースアセンブリのPostbuildeventcopy
2つのコピーが同じビルド生成(バージョン)からのものであると確信している場合でも、リフレクションロードのキャストは失敗します。
ここで少しコンテキストを与えるために、いくつかの擬似コードがあります。
private HookingHelper globalhooker;
private Tools.ISomething globalmockery;
TestfixtureSetUp(){
globalhooker = new globalhooker();
globalhooker.Loadfrom("c:\postbuildcopy.dll");
globalmockery = Mockrepository.Generate<Tools.ISomething>();
globalhooker.SetViaReflection<Tools.ISomething>("nameofsomething", globalmockery);
}
Loadfromを使用してアセンブリ内の静的を取得するヘルパークラスがあります。何かを呼び出す前に、モックを注入する必要があります。
このモックは、nunitが作成するため、デバッグバージョンのツールライブラリのシャドウコピーを使用して作成されます。
ロードされたライブラリはリリースバージョンです。これは、実際の環境にできるだけ近いテストを実行したいので、私にとって重要です。
リフレクションを使用して注入しようとするとFieldInfo SetValue(...)
、呼び出しを使用する必要があります。次のようになります。
public static void ReplaceFieldPublicStatic<T>(Type type, string fieldname, T obj)
{
FieldInfo field = AssemblyHelper.GetFieldInfoPublicStatic(type, fieldname);
field.SetValue((T)obj, obj);
}
Somethimes the Reflectionは機能し、私のタイプが互いにキャストできない場合があります。
エラーは、によって生成されたArgumentExceptionFieldInfo SetValue(...)
です。
field.FieldType != typeof(T)
例外を無視して、GetHashCode()呼び出しのみの違いを調べると、異なる値が得られます。
少しランダム性が関係していると思います。
タイプキャストを強制できますか?それも賢明ですか?
私が見逃しているプロジェクトを構築している間に私がしなければならないことがありますか?