在同一个模拟实例上断言对公共方法的调用

Dav*_*vy8 5 c# nunit unit-testing mocking fakeiteasy

我有以下测试

[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();
}
Run Code Online (Sandbox Code Playgroud)

问题是,该呼叫DealDamageAttack方法没有被注册,因为该方法中,thisrealAttacker不是wrappedAttacker攻击者因此调用该方法不被拦截.

我该如何测试这个断言?可以用FakeItEasy完成吗?是否有一个不同的模拟框架允许我测试它?

Dav*_*vy8 1

感谢@ckittel 向我指出这个答案。为此,Creature类需要有一个无参数构造函数,并且方法必须是虚拟的。

FakeItEasy 的另一件事似乎是你必须告诉它调用基本方法,否则从概念上讲它是相同的,只是语法不同。

[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();
}
Run Code Online (Sandbox Code Playgroud)