11

私はこのWebAPIプロジェクトに取り組んでおり、その単体テストを作成する必要があります。プロジェクトのベースはVS2010を使用して作成され、WebApiモジュールが追加されました。

コントローラの動作は、テスト/モックの邪魔になります。私はxUnitとMoqを使用していますが、これら2つに固執する必要はまったくありません。

アプリケーションは特定のオブジェクトを使用してデータベースアクセスを処理するため、controllerObjectがあり、そのコンストラクターにはDataAccessObjectが必要です。

コントローラとデータアクセスのペアのモックに問題があります。私が実行しようとしている最初のテストはGetAllFromDataBaseですが、実際にはそれを実行する方法についての手がかりがありません。

編集:

私はクオンルが私に言ったことをしました、そして全体は今動いています、私はそれを本当に感謝します。しかし、私は別の問題に困惑しました。APIにアクセスするには、ユーザー名とパスワードのペアがあり、コントローラーはThread.CurrentPrincipal.Identity.Nameを使用します。今のところ、完全に機能させるには、この値を設定する必要があると思います。

また、valueServiceMock.Setup(service => service.GetValues()).Returns(new [] {"value1"、 "value2"});

動作していないようです。コードがデータベースにアクセスしようとしますが、検索する有効なユーザー名を取得できないため、何も取得されません。

4

1 に答える 1

23

アプリをテスト可能にするには、テスト容易性を念頭に置いて設計する必要があります。技術的には、テスト可能性に合わせて設計するには、アプリをレイヤー間、コンポーネント間、さらにはクラス間で可能な限り緩く結合する必要があります。

テスト容易性のために設計するための多くのヒント:封印された静的クラスを避ける...しかし、注意する必要がある最も一般的なことは、依存性注入パターンです。他のオブジェクトのコンストラクターまたはメソッド内にオブジェクトを作成する代わりに、このオブジェクトを注入する必要があります。このようにして、クラス間の依存関係を緩め、フレームワークをモックして偽造しやすくします。Esp、外部リソースに依存するオブジェクト:ネットワーク、ファイル、またはデータベース。

依存性注入を使用してオブジェクトを注入する方法:これがIocContainerが適切なツールである理由です。これにより、オブジェクトが自動的に注入されます。私が使用するのが好きなIoCコンテナは、 AutofacNInjectです。

ValueServiceをValuesControllerに注入するためのここでの例:

public class ValuesController : ApiController
{
    private readonly IValueService _valueService;

    public ValuesController(IValueService valueService)
    {
        _valueService = valueService;
    }

    public string[] Get()
    {
        return _valueService.GetValues();
    }

    public string Get(int id)
    {
        return _valueService.GetValue(id);
    }
}

そして、以下はMoqでユニットテストするための簡単なコードです。

var valueServiceMock = new Mock<IValueService>();
valueServiceMock.Setup(service => service.GetValues())
            .Returns(new[] { "value1", "value2" });

var controller = new ValuesController(valueServiceMock.Object);
var values = controller.Get();

Assert.AreEqual(values.Length, 2);
Assert.AreEqual(values[0], "value1");
Assert.AreEqual(values[1], "value2");
于 2012-08-04T06:37:14.427 に答える