2

単体テスト ioc コンテナーのような用語を検索して、単体テストを実行するために IoC を実装する方法に関する質問を見つけるのは非常に困難ですが、これは以前に尋ねられたことはないと思います。

基本的に、IoC コンテナー自体に対して単体テストを実行したいと考えています。これは、コンテナーに問題が発生することがあるため (アプリケーションの他の部分と同様)、デバッグだけで依存関係の解決をテストするのは非常に面倒だからです。

これらの場合に単体テストを導入できれば、多くの手間が省けると思います。

アップデート

単体テストではなく、このようなものですか?統合テストですか?

[TestClass]
public class IoC
{
    private IWindsorContainer _container;

    [TestInitialize]
    public void TestInit()
    {
        _container = new WindsorContainer();
        _container.Install(new WindsorInstaller());
    }

    [TestMethod]
    public void ContainerShouldResolve_MembershipProvider()
    {
        ContainerShouldResolve<IMembershipProvider>();
    }

    public void ContainerShouldResolve<T>()
    {
        T result = _container.Resolve<T>();
        Assert.IsInstanceOfType(result, typeof(T));
    }
}

唯一の本当の「自己完結型ではない」参照は、私が配線しなければならなかった接続文字列ですapp.configPerWebRequestまた、ライフスタイル コンポーネントを解決しようとすると、関連するhttpModuleも追加する必要がありました。

ちなみに、これを行うことで、Web アプリケーションを使用してデバッグするのにかかった時間と比較して、問題の原因を短時間で発見できました。

4

2 に答える 2

1

これは、統合テストのカテゴリに分類されます。コンポーネント登録は、解決されると、あらゆる種類の外部システムコール(データベース、ファイルシステム、ネットワーク、サービスなど)を実行する可能性があります。これで、単体テストが終了します。

この種の(統合)テストに対して実行できる1つのアプローチは、アプリケーションのルートタイプを単純に解決することです。これは完全ではない可能性がありますが(特にアプリケーションが大量の遅延読み込みを行う場合)、欠落しているビットを見つけるには十分な場合がよくあります。

編集#2 (OP編集に応じて)

もちろん、言及されている外部システムに実際に触れることなくルート解決テストを実行することは可能かもしれませんが、実際のオブジェクト(偽物/スタブではない)での配線とセットアップの依存関係がまだたくさんある可能性があります。これは失敗する可能性のある多くの理由であり(単体テストには多すぎると思います)、これがどのテストカテゴリに分類されるかを判断するのは開発者次第です。

コンポーネント解決テスト(はるかに小さなスコープに関連する解決)を実行することは、単体テストには問題ないかもしれませんが、繰り返しになりますが、開発者が判断する必要があり、解決時にオブジェクトが何をするかに大きく依存します。最近のほとんどのコンテナは通常、単純なストレージ以上のものを提供するため、これを考慮に入れる必要があります。

私が言おうとしているのは、もしあなたが言ってDaoModule、それがコンテナから解決できることを確認したいのなら、確かに、これは単体テストかもしれません。ただし、DaoModuleセットアップ接続を解決し、DBにクエリを実行して有効な状態であるかどうかを確認する場合は、そのようなテストがどこに行くかを再検討する必要があります。

編集#1 (質問中のOPコメントに応じて)

コンテナーを構成し、抽象型(またはインターフェース)をスローして、期待される型に正しく解決するテストをセットアップしたいと思います。

基本的に、コンテナが機能するかどうかを確認しますか?それをしないでください。テストされたコンテナを選択するだけで、そのコンテナがその役割を果たしていると想定できます。サードパーティのコンポーネントを単体テストする必要があると感じた場合は、実際には別のコンポーネントを選択する必要があります。

于 2012-04-21T15:54:22.963 に答える
0

IoCのようなインフラストラクチャコードの単体テストを作成して、IoCの実装が正しいことを確認したい場合は、IoCの単体テストのソースコードを調べることができます。

たとえば、 DotNetのautofacIoCユニットテスト

あなたの質問に対する他の回答とコメント(そして最初の実行では私も)は、コンポーネントがIoCによって正しく配線されていることを確認する自動テストを作成したいと考えました。私たちのほとんどは、この種のテストを単体テストではなく統合テストと呼んでいます。

于 2012-04-21T16:08:55.373 に答える