Есть несколько способов сделать это.
Во-первых, ваша идея DoInstead довольно хороша, но я бы настроил ее так, чтобы она содержала утверждение:
Isolate.WhenCalled(() => Widget.GetPrice(0)).DoInstead(
context =>
{
var num = (int)context.Parameters[0];
Assert.AreNotEqual(456, num);
return "A";
});
Идеяесть то, что при вызове метода вы проверяете во время вызова, что входящий параметр соответствует ожидаемому вами, и проваливаете тест с помощью оператора Assert, если это не так.
(Вы также заметите, что яв качестве параметра укажите «0», потому что, как вы заметили, фактическое значение не имеет значения. Я считаю, что для будущего обслуживания проще использовать нуль / 0 / и т. д., когда параметры не имеют значения, поэтому вы не забываете«или« обмануть себя », думая, что это имеет значение.)
Второе, что вы можете сделать, это использовать WithExactArguments для управления поведением.
// Provide some default behavior that will break things
// if the wrong value comes in.
Isolate
.WhenCalled(() => Widget.GetPrice(0))
.WillThrow(new InvalidOperationException());
// Now specify the right behavior if the arguments match.
Isolate
.WhenCalled(() => Widget.GetPrice(123))
.WithExactArguments()
.WillReturn("A");
« WithExactArguments »сделает вашПоведение запускаем только , если аргументы совпадают.Когда вы запускаете тест, если передается недопустимое значение, генерируется исключение и тест завершается неудачей.
В любом случае, вы в конечном итоге скорее используете часть вещей WhenCalled для обработки вашего утверждения.чем "Подтвердить" вызов.