FakeItEasyを使用して、オブジェクトのメソッドがこの同じオブジェクトの別のメソッドを呼び出すかどうかを確認するにはどうすればよいですか?同じオブジェクトの別のメソッドにFakeItEasyのA.CallTo()を使用
テスト:
[TestMethod]
public void EatBanana_CallsWillEat()
{
var banana = new Banana();
var myMonkey = new Monkey();
myMonkey.EatBanana(banana);
//this throws an ArgumentException, because myMonkey is a real instance, not a fake
A.CallTo(() => myMonkey.WillEat(banana)
.MustHaveHappened();
}
クラス:
public class MyMonkey {
private readonly IMonkeyRepo _monkeyRepo;
public MyMonkey(IMonkeyRepo monkeyRepo) {
_monkeyRepo = monkeyRepo;
}
public void EatBanana(Banana banana) {
//make sure the monkey will eat the banana
if (!this.WillEat(banana)) {
return;
}
//do things here
}
public bool WillEat(Banana banana) {
return !banana.IsRotten;
}
}
私は提案を開いています。私が間違ったことをしているなら、私に知らせてください。
私はそれを理解しているので、これは実際にFIEのためではありません。 FIEは擬似オブジェクトを提供し、プロダクションコードをより簡単に突き刺すことができます。あなたが指摘しているように、あなたは偽物を持っていません。 私の経験では、この種のテストは通常良い考えではありません。あなたのMyMonkeyクラスは、かなり自己完結型のユニットでなければなりません。バナナを食べるように指示されたときは、それ自身のメソッドを呼び出すかどうかを心配するのではなく、全体的な動作をテストする方が良いでしょう。たとえば、「ここでは何をしているのか」ということから、何が起こったかの手がかりに基づいてバナナが食べられたかどうかを知ることができますか? –
@BlairConrad私の本当のシナリオでは、WillEatはもっと複雑で、独自のテストをしています。これはEatBananaが持つテストの一つに過ぎません。このテストでは、EatBananaに実際のWillEatを呼び込ませても、1回のテストで2つの機能をテストすることはできませんか?それから、WillEatが変更された場合、それは悪いニュースである、そのテストを破る可能性があります。 –
私はあなたのポイントを見ます。それはトリッキーです。 'WillEat'が別のオブジェクトに住んでいた場合、私たちはそのオブジェクトの偽造を促し、' MyMonkey'に注入します(痛い)。私が本当に言うことができるのは、クライアントの観察可能な結果に依拠して、外部からの「MyMonkey」のテストを試みることが、デフォルトの最善の位置にあると思うということです。 しかし、あなたはその中に考えを入れて、あなたの痛みを軽減し、テストの数を減らし、与えられた数に対して壊れる数を減らす解決策を見つけました。あなたが最良のコードを知っているので、それがあなたのために働くのであれば... 私はちょうどあなたが代替手段を知って欲しかった。 –