5

単体テストで依存性注入を使用すべきではないという事実に精通しているため、各レイヤーを個別に単体テストできます。

それでも、コントローラーの統合テストを作成したいと考えています。したがって、単体テストからリポジトリをコントローラーに挿入する必要があります。

私は、T4 スクリプトを使用して、各コントローラーのテスト クラスを作成し、各 ActionResult のテスト メソッドを含む一般的なアプローチに従います。このテスト メソッドは、単純にメソッドを呼び出して、表面に例外がスローされないことを確認する必要があります。

この T4 スクリプトを使用しているため、レポジトリをコントローラに手動でフィードできません。依存性注入を利用する必要があります。

私の以前の経験に基づいて、これはうまくいくはずですが、エラーが発生し続けます:

Unable to get default constructor for class <<UnitTest>>

私の生成されたクラスは、現時点では次のようになります。

[TestClass]
public class TestControllersHomeController
{
    private EL.NET.Web.Controllers.HomeController c;
    //setup
    public TestControllersHomeController(Project.Controllers.HomeController c)
    {
        this.c = c;
    }
    [ClassInitialize]
    public void ClassInitialize()
    {

        var kernel = NinjectWebCommon.CreatePublicKernel();
        kernel.Bind<TestControllersHomeController>().ToSelf();
        kernel.Bind<Project.Controllers.HomeController>().ToSelf();
    }
    [TestMethod]
    public void TestIndex()
    {
        var result = c.Index();
        Assert.IsNotNull(result);
    }

編集:

IKernel の GetService() メソッドを使用してリポジトリをロードできることは既にわかっています。しかし、メンバーシップ プロバイダーの場合、これは機能しません。繰り返しになりますが、プロバイダーをモックしたくはありません。統合テストを実行して、Controller メソッドが例外をスローするかどうかを知りたいのです。

4

1 に答える 1

4

単体テストにはデフォルトのコンストラクターが必要です。

[TestClass]
public class TestControllersHomeController
{
    private HomeController _sut;

    [TestInitialize]
    public void MyTestInitialize() 
    {
        var kernel = NinjectWebCommon.CreatePublicKernel();
        _sut = kernel.Resolve<HomeController>();
    }

    [TestMethod]
    public void TestIndex()
    {
        var result = _sut.Index();
        Assert.IsNotNull(result);
    }
}
于 2012-05-25T10:20:17.160 に答える