4

テストしたいオブジェクトのかなり重要な依存関係グラフがあります。どこでもモックを登録せずに依存関係を解決する最も簡単な方法は何ですか?

たとえば、次のような依存関係グラフがあります。

  PublicApi
    ApiService
      AccountingFacade
         BillingService
           BillingValidation
           BillingRepository
         UserService
           UserRepository

をテストしたいPublicApi.CreateUser()のですが、すべてのコードを実行したいのですが、データベースに何も書き込む必要がないようにリポジトリをモックしたいのです。DI コンテナーを使用してすべてのサービスを登録し、リポジトリをモックに置き換えてからPublicApi、メソッドを解決して実行する必要がありますか?

私はAutoFixtureを調べていましたが、このようなものを処理できるように見えますが、「フリーズ」と「登録」全体に頭を悩ませることはできず、Moqとの統合です。

4

2 に答える 2

7

単体テストでは、直接の依存関係のみをモックする必要があります。あなたの場合、モックを作成PublicApiして注入し、モックで正しい値で適切なメソッドを呼び出しているApiServiceかどうかを確認します。PublicApiApiService

より深い依存関係から分離された他のすべてのコンポーネントを同じ方法でテストします。

複数のコンポーネントの組み合わせをテストする場合、それは単体テストではなく統合テストです。したがって、クラスをどのようにまとめるかによって異なります。たとえば、IoC コンテナーを使用している場合、おそらく何らかの方法でリポジトリの構成を置き換えることがサポートされています。この場合、アプリケーションの構成を使用して、リポジトリと場合によってはビューもモックに置き換えることができます。

于 2011-11-02T15:59:50.623 に答える
1

これは少なくとも役に立たないかもしれませんが、とにかくそれを言います。

一度にテストしすぎているようです。BillingService->BillingValidation、次にBillingService-> BillingRepositoryなどをテストしてみませんか。このようにして、それぞれが機能することを証明する一連のテストを行います。 PublicApiレイヤーは、その下にあるすべてのものをすでにテストしているため、ApiServiceをモックするだけで済みます。したがって、再度テストする価値はありません。

通常、一度に1つのレイヤーのみをテストしますが、完全なシナリオがわからないため、私が説明していないものがある可能性があります。そのため、この場合、これらすべてを一緒にテストする必要がある場合は、 Ninjectなどのシンプルで軽量なDIフレームワークで。

このようにして、すべてのタイプをモックにバインドし、そこからPublicApiをインスタンス化できます。

ninjectを使用すると、次のようになります。

Kernel.Bind<UserRepository>.ToConst(YourMockUserRepositoryInstance);
Kernel.Bind<UserService>.ToConst(YourMockUserServiceInstance);
Kernel.Bind<BillingRepository>.ToConst(YourMockBillingRepositoryInstance);
Kernel.Bind<BillingValidation>.ToConst(YourMockBillingValidationInstance);
Kernel.Bind<BillingService>.ToConst(YourMockBillingServiceInstance);
Kernel.Bind<AccountingFacade>.ToConst(YourMockAccountingFacadeInstance);
Kernel.Bind<ApiService>.ToConst(YourMockApiServiceInstance);
Kernel.Bind<PublicApi>.ToSelf();

var publicApi = Kernel.Get<PublicApi>();

自問する必要がありますが、ここで何をテストしていますか?私が最初に述べたように、それが単なる相互作用である場合、それ以上の場合は、後者の選択について考えるかもしれません。いずれにせよ、私はそれがあなたにいくつかのオプションを与えることを願っています。

于 2011-11-02T16:01:00.997 に答える