Есть еще пара статей по этому вопросу, и я думал, что моя проблема в другом, однако я сделал следующее и исправил это с помощью общего решения, которое нашел в других постах:
Проверенные параметры метода get_post_meta доступны для чтения методу (в моем случае $ item_id был недопустимым, метод требует фактический идентификатор сообщения продукта)
Проверьте условие фактически использовал правильные значения: if ($ custom_field == "yes")
Окончательный код для функции foreach:
foreach ( $order->get_items() as $item_id => $item ) {
$product_id = $item->get_product_id();
$custom_field = get_post_meta( $product_id, '_custom_field', true );
$line_total = $item->get_total();
if( $custom_field == "yes" ) {
$amount += $line_total;
}
}
Есть три способа:
Вы можете сбросить ожидания с помощью BackToRecord
Я должен признать, что Я никогда не использовал его, потому что это неловко.
// clear expectations, an enum defines which
_stubRepository.BackToRecord(BackToRecordOptions.All);
// go to replay again.
_stubRepository.Replay();
Редактировать: Теперь я использую его иногда, это на самом деле самый чистый способ. Должен быть метод расширения (например, Stub), который делает это - я думаю, что он просто забыт. Я бы предложил написать свой.
Вы можете использовать Repeat.Any ()
. Он «нарушает» порядок определения с заглушкой и «переопределяет» предыдущие определения. Но это как-то неявно. Я использую его иногда, потому что это легко написать.
_stubRepository.Stub(x => x.Contains(null))
.IgnoreArguments()
.Return(false)
.Repeat.Any();
Вы можете создать новый макет
Тривиально, но явно и легко понять. Это проблема, только если вы хотите сохранить множество определений и изменить только один вызов.
_stubRepository = MockRepository.GenerateMock<IRepository>();
_stubRepository.Stub(x => x.Contains(null))
.IgnoreArguments()
.Return(false);