34

MicrosoftSyncFrameworkのクラスをモックしようとしています。内部コンストラクターのみがあります。私が次のことを試してみると:

var fullEnumerationContextMock = new Mock<FullEnumerationContext>();

このエラーが発生します:

System.NotSupportedException:親にはデフォルトのコンストラクターがありません。デフォルトのコンストラクターは明示的に定義する必要があります。

これはスタックトレースです。

System.Reflection.Emit.TypeBuilder.DefineDefaultConstructorNoLock(MethodAttributes属性)System.Reflection.Emit.TypeBuilder.DefineDefaultConstructor(MethodAttributes属性)System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()System.Reflection.Emit.TypeBuilder.CreateType()Castle。 DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType()Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type [] interfaces、ProxyGenerationOptions options)Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy(Type classToProxy、Type [] additionalInterfacesToProxy、ProxyGenerationOptions options)Castle。 DynamicProxy.ProxyGenerator.CreateClassProxyType(Type classToProxy、Type [] additionalInterfacesToProxy、ProxyGenerationOptions options)Castle.DynamicProxy.ProxyGenerator。CreateClassProxy(Type classToProxy、Type [] additionalInterfacesToProxy、ProxyGenerationOptions options、Object []コンストラクター引数、IInterceptor []インターセプター)Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy、Type [] additionalInterfacesToProxy、ProxyGenerationOptionsオプション、IInterceptor []インターセプター)Castle.DynamicProxy .ProxyGenerator.CreateClassProxy(Type classToProxy、Type [] additionalInterfacesToProxy、IInterceptor []インターセプター)Moq.MockDynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy、Type [] additionalInterfacesToProxy、IInterceptor []インターセプター)Moq.MockDynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy、Type [] additionalInterfacesToProxy、IInterceptor []インターセプター)Moq.Mock1.<InitializeInstance>b__0() Moq.PexProtector.Invoke(Action action) Moq.Mock1.InitializeInstance()

どうすればこれを回避できますか?

4

5 に答える 5

23

Moqはその型のオブジェクトをインスタンス化できないため、パブリックコンストラクターを持たない型をモックすることはできません。テストしようとしているものに応じて、いくつかのオプションがあります。

  1. FullEnumerationContextのインスタンスを取得するファクトリオブジェクトまたはその他の方法がある場合は、おそらくそれを使用できます(申し訳ありませんが、同期フレームワークに精通していません)
  2. プライベートリフレクションを使用してFullEnumerationContextをインスタンス化することはできますが、その場合、メソッドをモックすることはできません。
  3. テスト対象のコードが呼び出すことができるモック可能なインターフェイスやラッパーオブジェクトを導入できます。ランタイム実装は実際のFullEnumerationContextに委任しますが、テスト時実装は必要なアクションを実行します。
于 2010-07-19T17:42:04.580 に答える
4

私はMoqの専門家ではありませんが、コンストラクターの引数を指定する必要があると思います。Rhino Mocksでは、次のように指定します。

var fullEnumerationContextMock = new Mock<FullEnumerationContext>(arg1, arg2);

おそらくMoqでも同様です。

于 2010-07-19T09:17:08.527 に答える
3

実際にできます。AssemblyInfo.csファイルを開き、最後に次の行を追加します。

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

于 2017-08-14T11:09:57.193 に答える
2

marcindからの回答に基づいて、モックするインターフェイス(IFullEnumerationContext)を作成しました。次に、テストしようとしているメソッドの2つのオーバーロードがあります。1つはを取得し、FullEnumerationContextもう1つはを取得しますIFullEnumerationContext。気分は良くありませんが、機能します。より良い提案や改善があれば歓迎します。

public override void EnumerateItems(FullEnumerationContext context)
{
    List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon();
    context.ReportItems(listItemFieldDictionary);
}

public void EnumerateItems(IFullEnumerationContext context)
{
    List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon();
    context.ReportItems(listItemFieldDictionary);
}
于 2010-07-20T12:30:45.130 に答える
1

テスト対象システムプロジェクトでは、次のものが必要です。

  • protected internalSUTクラスでのコンストラクターの可視性(例FullEnumerationContext
  • AssemblyInfo.cs内部をテストプロジェクトに公開する必要があります。

    [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
    
于 2019-12-04T19:41:10.033 に答える