fixture.createannymousメソッドAutomoQを使用してコントローラーを作成すると、エラー(autofixture)でテストランナープロセスを殺します

StackOverflow https://stackoverflow.com/questions/3514102

質問

AutoFixtureを使用してAutomoQustomizationを使用して、fixture.createannymousメソッドを介してユニットテストでASP.NET MVC2コントローラーを作成しようとしています。 TestDriven.net、Xunit Test GUI、MSTESTでXunitの両方で試しましたが、すべて同じ結果が得られました。テストを実行しているプロセスの大きな障害です。それが重要な場合は、Windows 7 x64で。

複製するには、新しいASP.NET MVC2プロジェクトを作成するだけで、自動フィクストール、AutomoQ、MOQへの参照を追加し(AutomoQソースに従って3.1)、以下を試してください(以下のRepro VS2010 MVC2プロジェクトリンク):

[TestMethod]
public void Index()
{
 var fixture = new Fixture().Customize(new AutoMoqCustomization());
    // here's where the error in the test host occurs:
 HomeController controller = fixture.CreateAnonymous<HomeController>();
}

MSTESTでは、エラーが読み取ります。

ランタイムには致命的なエラーが発生しました。エラーのアドレスは、スレッド0x2684の0x6465F370でした。エラーコードは0xc0000005です。このエラーは、CLRまたはユーザーコードの安全でないまたは非検証不可能な部分のバグである可能性があります。このバグの一般的なソースには、com-interopまたはpinvokeのユーザーマーシャリングエラーが含まれます。

afwithmvc reproプロジェクト(SkyDriveから)

役に立ちましたか?

解決

提案された解決策

可能な解決策から始めるために、これによりクラッシュが停止するはずです。

var fixture = new Fixture().Customize(new AutoMoqCustomization());
// This should fix the problem for all Controllers
fixture.Customize<ViewDataDictionary>(c =>
    c.Without(x => x.ModelMetadata));

HomeController controller = fixture.CreateAnonymous<HomeController>();

説明

そして今説明のために:

このテストエラーは、自動フィクストールによって引き起こされます オートプロパティ 値を割り当てようとする機能 HomeController.ViewData.ModelMetaData. 。 Modelmetadataクラスには、このコンストラクターがあります。

public ModelMetadata(
    ModelMetadataProvider provider,
    Type containerType,
    Func<object> modelAccessor,
    Type modelType,
    string propertyName)

ここの犯人です modelAccessor パラメーター。そのプロパティを埋めるために、自動フィクストール(むしろ無意識のうちに)は、このタイプを反映し、この単一のコンストラクターを見つけます。

public Func(object @object, IntPtr method)

さらに掘り下げると、最初のINTPTRコンストラクターオートフィクストールが満たすことができます。

public unsafe IntPtr(int value)

デフォルトでは、 INT32インスタンスは、決定論的上昇シーケンスによって作成されます, 、 それで value この場合、おそらく1または2または同様の小整数になります。言い換えれば、私たちは今持っています 非常に無効です 安全でないポインターが私たちの手にあり、これによりプロセスがクラッシュしています。

今、通常の状況では、登録することでこれを修正できるはずです Func<object> フィクスチャーと、すべてがダンディである必要があります:

fixture.Register<Func<object>>(() => () => new object());

しかし、私はあなたのreproでこれを試しましたが、プロセスは同じようにクラッシュしなくなりましたが、テストは非常に長い間実行され、最終的にOutOfMemoryExceptionでクラッシュします。

ASP.NET MVCが何をしているのかわかりません Func<object>, 、しかし、どうやらそれはかなり重いものを使用しています。

これがオートフィックスのバグであるかどうかは問題が残っていますか?

そうではないと思います。それは間違いなく理想的ではありませんが、オートフィックスチュールは他のタイプとは異なる方法で機能やアクションを扱わないため、この動作が見られます。

この特定の動作は、特定のサポートを追加することにより、おそらく対処できます Func<TResult>, 、しかし、一貫性を保つためにもサポートが必要です Func<T, TResult>, Func<T1, T2, TResult>, 、など。Net4のAfairがあります 多くの これらのデリゲートタイプ(アクションなど)のうち、それは多くのタイプの全体にサポートを追加することを意味します。

しかし、コンストラクターにINTPTRを取得する他のすべてのタイプはどうでしょうか?オートフィックスはそれらすべてについておそらく知ることができないので、これは実行可能な方向のようではないようです。

しかし、それは何ですか たぶん......だろう 持っています そもそもINTPTRインスタンスを作成しようとすることを防ぐガード. 。これは、おそらく2.0 RTWの前に追加される可能性が高いです。

これを報告していただきありがとうございます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top