«Call-site требует проверки» сделает это. Затем перезаписывающее устройство помещает предварительные условия в код вызывающий , а не в реализации . Таким образом, хотя код в макетируемом объекте не мог быть переписан (он генерируется во время выполнения), код в вызывающей программе может быть.
Вот как выглядит сгенерированный код без call-сайта. Требуется:
private static void Main(string[] args)
{
Mock<IDog> m = new Mock<IDog>();
m.Object.Eat(null);
}
А с:
private static void Main(string[] args)
{
Mock<IDog> m = new Mock<IDog>();
IDog.V$Eat(m.Object, null);
}
IDog - это статический класс, который содержит все методы интерфейса IDog, а также предварительные условия. Вот как выглядит Eat:
internal static void V$Eat(IDog @this, object obj)
{
__ContractsRuntime.Requires<ArgumentNullException>(
obj != null, null, "obj != null");
@this.Eat(obj);
}
Таким образом, предварительные условия будут вызываться, даже если код в классе не мог быть переписан.