1

Ninject.Moqを使用して次のコードを実行しようとしています。

[TestMethod]
public void TestMethod1()
{
    var kernel = new MockingKernel();
    var engine = kernel.Get<ABC>();

   //as I don't need to actually use the interfaces, I don't want
   //to even have to bother about them.

    Assert.AreEqual<string>("abc", engine.ToString());
}

そして、これがABCクラスの定義です。

public class ABC {
    IA a;
    IB b;

    public ABC(IA a, IB b)
    {
        this.a = board;
        this.b = war;
    }

    public override string ToString()
    {
        return "abc";
    }
}

次の例外が発生します。

System.ArgumentException:指定された引数に一致するコンストラクターがモックタイプで見つかりませんでした。---> System.MissingMethodException:タイプ'AbcProxya759aacd0ed049f3849aaa75e2a7bade'のコンストラクターが見つかりません。

4

2 に答える 2

3

わかりました、これでコードが機能します。

[TestMethod]
public void TestMethod1()
{
    var kernel = new MockingKernel();
    kernel.Bind<Abc>().ToSelf();
    var engine = kernel.Get<ABC>();

   //as I don't need to actually use the interfaces, I don't want
   //to even have to bother about them.

    Assert.AreEqual<string>("abc", engine.ToString());
}

それ自体にバインドするAbc必要があります。そうしないと、モックも取得され、Moq はパラメーターなしのクラスのモックのみをサポートしますが、そうではありません。

于 2010-08-19T12:10:21.970 に答える
2

そもそも DI を理解するのと少し似ています:-小さなサンプルでは、​​全体の要点を実際に理解することはできません。

Ninject.Moq (または AutoFixture のような同様のテスト インフラストラクチャ ライブラリ)のような自動モック コンテナーは、単純な例で実際に説明するのは困難です。この要件を理解する方法として、AutoFixture に関する Mark Seemann の投稿をすべて読むことをお勧めします。

したがって、Ninject.Moq は、テストが実際にテストすることになっていることを実行する過程で、テスト対象のシステムを満たすために必要なインターフェースの一連のスタブ実装の深さ N レベルの連鎖を処理します。

一般に、簡潔で読みやすく、簡単に理解できるテストが必要であり、複雑さが最小限であり、フィクスチャの相互作用がカバーされていません (基本クラスの大きな階層や、風変わりなティアダウンを行って基本クラスを呼び出す 6 つの異なる魔法のメソッドはありません)。通常、この目的は、DI ツールを単体テストから遠ざける必要があることを意味します。

自動モック コンテナーは、チェーンソーのように、投資 (他の人がテストを読む前に理解するための別のツール、より多くのデバッグより多くの驚き、より複雑になり、脆弱で保守不可能なテストにつながります)。

于 2010-08-16T08:51:29.773 に答える