「SUT内で何が起こるかを制御できるようにクラスをスタブする方法」に関する複数の回答を見てきました。
彼らは 1 つのことを言います:
インターフェースを作成し、依存性注入を使用してそのインターフェースを注入し、同じインターフェースを使用してスタブを作成し、それを SUT に注入します。
しかし、以前の職場で学んだこと:
単体テストを行う場合は、すべてのクラス/機能をテストします。
それは、特定の関数レイアウトを持つすべてのクラスに対して、インターフェイスを作成する必要があるということですか?
これは、クラス/ファイルの量が約 2 倍になることを意味します。
以下の例に見られるように、これは「進むべき道」ですか、それとも単体テスト プロセスで何か不足していますか?
注: 私は VS2012 Express を使用しています。つまり、「フェイカー」フレームワークはありません。「標準」の VS2012 単体テスト フレームワークを使用しています。
非常に単純な例として、SUT に渡された各インターフェイスをスタブ化できるようにします。
IFoo.cs
public interface IFoo
{
string GetName();
}
Foo.cs
public class Foo : IFoo
{
public string GetName()
{
return "logic goes here";
}
}
IBar.cs:
public interface IBar : IFoo
{
IFoo GetFoo();
}
Bar.cs:
public class Bar : IBar
{
public string GetName()
{
return "logic goes here";
}
public IFoo GetFoo()
{
return null; // some instance of IFoo
}
}
IBaz.cs:
public interface IBaz
{
IBar GetBar();
}
Baz.cs:
public class Baz
{
public IBar GetBar()
{
return null; // some instance of IBar
}
}