0

いつ静的クラスを使用してもよいかはわかっていますが、私の簡単な質問は次のとおりです。

静的クラスを持つコードを単体テストしているときに大きな問題が発生した場合は?

通常のインスタンス クラスを使用する方が良いですか?

ありがとうございます (これについていくつかの質問があることは知っていますが、すべてが特定のケースに基づいているため、一般的な意見が欲しいだけです)

4

1 に答える 1

0

私がしていることは、既存の静的クラスの使用を継ぎ目として取り、別の名前空間で代替の実装を提供することです。これは、名前空間を変更するだけで、できるだけ少ない変更でテスト対象のコードを取得できることを意味します。通常、C#ファイルシステムの操作(File.Existsなど)を回避するためにこれを行う必要がありました。

あなたのメソッドが基本的にこれを行うとしましょう:

using System.IO;

public void SomeMethod()
{
    ...
    if(File.Exists(myFile))
    {
        ...
    }
    ...
}

次に、そのFileの実装を別の実装に置き換えます。代替実装は、既存のメソッドをスタブ化し、内部で実装を委任するための呼び出しを行う必要があります-例:

namespace IO.Abstractions 
{     
    public static class File
    {         
        public static Func<string, string, string> ExistsImpl =
                                                      System.IO.File.Exists;

        public static string Exists(string path)
        {             
            return ExistsImpl (path);
        }
    }
} 

次に、新しい名前空間を使用するように元のコードを変更します。

using IO.Abstractions;

public void SomeMethod()
{
    ...
    if(File.Exists(myFile))
    {
        ...
    }
    ...
}

次に、テストで、File.Existsの動作の代替実装を次のように提供できます。

[Test]
public void SomeTest()
{
    // arrange
    ...
    File.ExistsImpl = (path) => true; // to just default to true for every call
    ...

    // act
    someClass.SomeMethod();

    // then assert
    ...
}

最近、ここで詳細をブログに書きました。

于 2011-10-07T07:33:01.503 に答える