1

「ユニットテストの芸術」atmを読んでいて、プロパティを使用してインターフェイスに渡す際に問題が発生しています。この本には、次のように記載されています。

プロパティの例のコードは次のとおりです。

public class LogAnalyzer
{
    private IExtensionManager manager;
    public LogAnalyzer ()
    {
        manager = new FileExtensionManager();
    }

    public IExtensionManager ExtensionManager
    {
        get { return manager; }
        set { manager = value; }
    }

    public bool IsValidLogFileName(string fileName)
    {
        return manager.IsValid(fileName);
    }
}

[Test]
Public void
IsValidFileName_NameShorterThan6CharsButSupportedExtension_ReturnsFalse()
{
    //set up the stub to use, make sure it returns true
    ...
    //create analyzer and inject stub
    LogAnalyzer log = new LogAnalyzer ();
    log.ExtensionManager=someFakeManagerCreatedEarlier;

    //Assert logic assuming extension is supported
    ...
}

この機能をいつ/どのように使用しますか?? 私が考えることができる唯一のシナリオ (これはおそらく間違っています!) は、1 つのクラスに 2 つのメソッドがある場合です。

Method1() は、構成ファイルからデータベース接続文字列を取得し、取得した文字列に対する何らかの形式のチェックを含みます。

その後、Method2() はデータベースに接続し、いくつかのデータを返します。ここでのチェックは、返されたデータが null でないことでしょうか?

この場合、Method1() をテストするために、IExtensionManager インターフェイスを実装するスタブを宣言することができます。このスタブには、method1() で行ったエラー チェックに合格する必要がある文字列があります。

Method2() の場合、インターフェイスを実装するスタブを宣言し、データを含むデータテーブルをスタブ クラスで宣言します。次に、プロパティを使用してこれをプライベート マネージャー変数に割り当て、Method2? を呼び出します。

上記は完全な BSである可能性があります。

ありがとう

4

1 に答える 1

0

オブジェクトの作成後にオブジェクトの動作を変更するために使用されるプロパティインジェクション。

ところで、あなたのコードはFileExtensionManager、の具体的な実装である、と緊密に結合されていIExtensionManagerます。LogAnalyzerデフォルトのマネージャーでどのようにテストしますか?コンストラクターインジェクションを使用して、オブジェクトに依存関係を提供します。これにより、オブジェクトがテスト可能になります。

public LogAnalyzer (IExtensionManager manager)
{
    this.manager = manager();
}
于 2012-07-11T10:47:05.953 に答える