7

FakeItEasy を使用して、オブジェクトのメソッドがこの同じオブジェクトの別のメソッドを呼び出しているかどうかを確認するにはどうすればよいですか?

テスト:

[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;
  }
}

私は提案を受け入れます。私がこれについてすべて間違っている場合は、私に知らせてください。

4

2 に答える 2

3

なぜあなたはテストされたオブジェクトを嘲笑しているのですか? 正確に何をテストしようとしていますか?への呼び出しがWillEat発生したことの検証は、ほとんど価値がありません。消費者にどのような情報を提供しますか? 結局のところ、消費者はメソッドがどのように実装されているかを気にしません。消費者は結果がどうなるかを気にします。

サルが腐っていないバナナを食べるとどうなる?テストは次の質問に答える必要があります。

[TestMethod]
public void EatBanana_CAUSES_WHAT_WhenBananaIsNotRotten()
{
    var repo = A.Fake<IMonkeyRepo>();
    var monkey = new Monkey(repo);
    var freshBanana = new Banana { IsRotten = false };

    monkey.EatBanana(freshBanana);

    // verifications here depend on what you expect from
    // monkey eating fresh banana
}

に対してあらゆる種類の検証を行うことができることに注意してくださいIMonkeyRepo。これは適切に偽造され、ここに挿入されます。

于 2013-07-29T21:24:31.447 に答える
2

これを行うことは可能です。メソッドが仮想の場合- そうでない場合、WillEatFakeItEasy は偽造できません。

その変更により、これを行うことができます:

[TestMethod]
public void EatBanana_CallsWillEat()
{
    var fakeMonkey = A.Fake<MyMonkey>();

    fakeMonkey.EatBanana(new Banana());

    A.CallTo(()=>fakeMonkey.WillEat(A<Banana>._)).MustHaveHappened();
}

私はまだそれが良い考えだとは確信していません (コメントで怒鳴ったように) - 他の観察可能な動作に頼る方が良いと思いますが、私はあなたのシステムに慣れていません. これが最善の方法であると思われる場合は、サンプル コードが役立つはずです。

于 2013-07-29T20:13:02.543 に答える