いつ静的クラスを使用してもよいかはわかっていますが、私の簡単な質問は次のとおりです。
静的クラスを持つコードを単体テストしているときに大きな問題が発生した場合は?
通常のインスタンス クラスを使用する方が良いですか?
ありがとうございます (これについていくつかの質問があることは知っていますが、すべてが特定のケースに基づいているため、一般的な意見が欲しいだけです)
いつ静的クラスを使用してもよいかはわかっていますが、私の簡単な質問は次のとおりです。
静的クラスを持つコードを単体テストしているときに大きな問題が発生した場合は?
通常のインスタンス クラスを使用する方が良いですか?
ありがとうございます (これについていくつかの質問があることは知っていますが、すべてが特定のケースに基づいているため、一般的な意見が欲しいだけです)
私がしていることは、既存の静的クラスの使用を継ぎ目として取り、別の名前空間で代替の実装を提供することです。これは、名前空間を変更するだけで、できるだけ少ない変更でテスト対象のコードを取得できることを意味します。通常、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
...
}
最近、ここで詳細をブログに書きました。