5

次のテストがあります

[Test]
public void Attack_TargetWith3Damage_CausesAttackerToDeal3DamageToTarget()
{
    var realAttacker = CreateCreature(damage: 3);
    var wrappedAttacker = A.Fake<ICreature>(x => x.Wrapping(realAttacker));
    var target = A.Fake<ICreature>();
    wrappedAttacker.Attack(target);
    A.CallTo(() => wrappedAttacker.DealDamage(target, 3)).MustHaveHappened();
}

問題は、メソッド内で攻撃者ではないため、メソッドDealDamageからの呼び出しAttackが登録されていないため、メソッド呼び出しが傍受されていないことです。thisrealAttackerwrappedAttacker

このアサーションをテストするにはどうすればよいですか? これは FakeItEasy で実行できますか? 別のモック フレームワークでこれをテストできますか?

4

2 に答える 2

3

モッキング フレームワークにMoqを使用した後は、現在の状態にかなり近づけることができます。

これを例にとります:

public interface ICreature { ... }

public class Creature : ICreature
{
    ... 

    public void Attack(ICreature creature)
    {
        DealDamage(creature, 3); // Hard-coded 3 to simplify example only
    }

    public virtual void DealDamage(ICreature target, int damage) { ... }
}

.... Test ....
var wrappedAttacker = new Mock<Creature>();
var mockTarget = new Mock<ICreature>();

wrappedAttacker.Object.Attack(mockTarget.Object);

wrappedAttacker.Verify(x => x.DealDamage(mockTarget.Object, 3), Times.Once());

この場合、Creature インスタンスを攻撃者ロールのモックに「ラップ」しICreature、ターゲット ロールのモックを作成します。Attack次に、攻撃者からメソッドを呼び出します。同じ攻撃者DealDamageが (正しいターゲットと 3 ダメージで) 正確に 1 回呼び出されたことを確認します。

Moq でこの検証を可能にするのは、DealDamage関数がマークされていることvirtualです。これはあなたの状況では契約を破るかもしれませんが、「別のモッキングフレームワークでこれをテストできますか?」という質問に対処します.

于 2011-08-14T15:16:14.533 に答える
1

この回答を教えてくれた@ckittelに感謝します。これが機能するには、Creatureクラスにパラメーターなしのコンストラクターが必要であり、メソッドが仮想である必要があります。

FakeItEasy の 1 つの余分な点は、基本メソッドを呼び出すように指示する必要があるようです。それ以外の場合は、概念的には同じで、構文が異なるだけです。

[Test]
public void Attack_TargetWith3Damage_CausesAttackerToDeal3DamageToTarget()
{
    var attacker = A.Fake<Creature>();
    A.CallTo(attacker).CallsBaseMethod(); //Otherwise it seems all calls are no-ops.
    attacker.Stats.Damage = 3;

    var target = A.Fake<ICreature>();
    attacker.Attack(target);
    A.CallTo(() => attacker.DealDamage(target, 3)).MustHaveHappened();
}
于 2011-08-14T16:59:57.187 に答える