Вы можете быть очень близки к тому, что вы есть после использования 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 повреждениями), ровно один раз.
Что делает эту проверку возможной в Moq, так это то, что функция DealDamage
помечена virtual
. Это может нарушить условия вашей ситуации, но оно затрагивает вопрос ". Позволяет ли мне проверить этот вопрос другой механизм насмешек? ".