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)
问题是,该呼叫DealDamage
从Attack
方法没有被注册,因为该方法中,this
是realAttacker
不是wrappedAttacker
攻击者因此调用该方法不被拦截.
我该如何测试这个断言?可以用FakeItEasy完成吗?是否有一个不同的模拟框架允许我测试它?
感谢@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)