たちは
public interface IStack
{
bool IsEmpty { get; }
}
public class StackImpl1 : IStack
{
public StackImpl1(int size)
{
IsEmpty = true;
}
public bool IsEmpty { get; }
}
public class StackImpl2 : IStack
{
public StackImpl2(int size)
{
IsEmpty = true;
}
public bool IsEmpty { get; }
}
を以下していると言うそして、私たちはOPからIsEmpty_OnCreation()
テストを実施したいです。私たちはできます共通のテストを行い、複数のinvoker(テストする各実装の1つ)を追加します。問題は拡大縮小です。
我々は
1を追加する必要がテストするための機能のそれぞれの新しい部分のための
)テスト実装
2)試験対象の各実装のための呼び出し。
新しい導入については、既存のテストごとに呼び出し元を追加する必要があります。
テストが各派生固定具に生成されている私たち
public abstract class StackTest
{
protected abstract IStack Create(int size);
[TestMethod]
public void IsEmpty_NoElements()
{
var myStack = Create(10);
var exp = true;
var act = myStack.IsEmpty;
Assert.AreEqual(exp, act);
}
}
[TestClass]
public class StackImp1Fixture : StackTest
{
protected override IStack Create(int size)
{
return new StackImpl1(size);
}
}
[TestClass]
public class StackImp2Fixture : StackTest
{
protected override IStack Create(int size)
{
return new StackImpl2(size);
}
}
のためにほとんどの作業を行うために、継承を使用することが可能です。
新しいテストを追加したい場合は、StackTest
クラスに追加し、それが自動的に各派生フィクスチャに含まれます。
IStack
の3番目の実装を追加する場合は、StackTest
から派生した新しいテストフィクスチャを追加し、createメソッドをオーバーライドするだけです。
注:テスト対象のクラスは、デフォルトコンストラクタを持っている場合は、あなたが属しているコードをリファクタリングする必要があり、他のコードと同じように
、同じ形状をベース
public class GenStackTest<TStack> where TStack : IStack, new()
{
[TestMethod]
public void IsEmpty_NoElements()
{
var myStack = new TStack();
var exp = true;
var act = myStack.IsEmpty;
Assert.AreEqual(exp, act);
}
}
[TestClass]
public class GenStack1Fixture : GenStackTest<StackImpl1>
{
}
[TestClass]
public class GenStack2Fixture : GenStackTest<StackImpl2>
{
}
としてジェネリックStackTestで使用することができます両方のシナリオを独自のクラスにまとめて、異なるユースケースで使用することができます。したがって、すでにテストケース1の実装が*リファクタリングしている場合は、その動作を独自のクラスにリファクタリングし、両方のテストでインスタンスを使用します。 – HimBromBeere