クラスを継承すると、クラスのテストが非常に簡単になることがわかりました。このseudoの例を考えてみましょう。
public class Bizz
{
public void Do()
{
var obj = ExtenOutOfTest();
someList.Add(obj);
}
protected List<ISomeObejct> someList = new ISomeObejct<ISomeObejct>();
protected virtual ISomeObejct ExtenOutOfTest()
{
//return real obejct
}
}
テストは次のようになります。
[TestClass]
public class BizzTest : Bizz
{
private ISomeObejct _fakedObj;
protected override ISomeObejct ExtenOutOfTest()
{
return _fakedObj;
}
[TestMethod]
public void Test_Do_Add()
{
_fakedObj = new Fake<ISomeObejct>().FakedObject;
Assert.IsFalse(someList.Any());
base.Do(); //<-- target
Assert.IsTrue(someList.Any());
}
}
これで、テストを分離することができ、 Bizzオブジェクトは、想定されている以外のメソッドを公開しません。
この方法でユニットテストを行うのは悪い習慣ですか?
IDisposableを実装するようにクラスを変更するとBizz
、テストを実行できなくなります。
~Bizz(){Dispose(false);}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if(!disposing) return;
//do cleanup resources
}
失敗したことを示す前に起動することさえありません: ユニットテストアダプターが例外をスローしました:あいまいな一致が見つかりました。
仮想化してからテストクラスでオーバーライドしようとしDispose
ましたが、機能しませんでした。
どんな助けでも大歓迎です。