2

私はTDDの概念に慣れようとしており、その「行為」部分が次のようになる最初のテストを書きました:

repositoryStub = new Mock<IMyRepository>();
var sut = new MyController(repositoryStub.Object);
var result = sut.Index() as ViewResult;

ビューモデルの作成中に、MyController最終的に(深く)インスタンス化するコントローラー( )はを使用します。ConfigurationManager.AppSettingsコントローラーのインスタンス化は、Web.Config から読み取ろうとしている行で失敗しますが、プロジェクトが IDE から実行されただけの場合は、明らかに期待どおりに実行されます。MyProject.Testweb.config ファイルから定数を読み取っていますが、これはテストに影響を与えず、別の ( ) プロジェクトから呼び出されると失敗するとは予想されませんでした。

皆さんへの私の質問は、この障害をどのように克服するかです。

ここで問題になるかどうかはわかりませんが、xUnit念のため、TDD に使用しています。ありがとう!

4

1 に答える 1

1

深く使用している構成は、と同じ種類の依存関係であることを理解する必要がありますIMyRepository。抽象コントラクト(インターフェース)を介してリポジトリーを注入します。構成に対して同じことが行われないのはなぜですか?迅速で素朴な解決策は、IConfigurationインターフェイスを作成し、への呼び出しを委任するだけでそれを実装することConfigurationManagerです。コンストラクターは次のようになります。

public class MyController(IMyRepository repository, IConfiguration configuration)

それは私たちに何を伝えますか?まあ、残念ながらそれほど多くはありません。コントローラに設定が必要であるという事実は非常にあいまいです。本当の問題は、必要な構成からの正確なパラメーターは何ですか?そのパラメータを特定する必要があり、それが注入したい実際の依存関係です。検討:

  • MyController(IMyRepository repository, IConfiguration configuration)
  • MyController(IMyRepository repository, int serviceCallTimeoutSeconds)
  • MyController(IMyRepository repository, string serviceAccessKey)

どちらがその目的をよりよく伝えますか?コントローラが単一機能指向であるほど、使用する必要のあるパラメータは少なくなります。あなたの問題はあなたが思っているところにないかもしれません。

于 2013-03-23T23:13:02.720 に答える