При выполнении тестов контроллеров я обычно стараюсь имитировать как можно меньше, лично, если я хочу протестировать обработку ошибок в контроллерах, я пытаюсь вызвать фактические ошибки, например, предоставляя данные, которые не соответствуют правилам приложения / проверки.Если это приемлемый вариант, возможно, вы захотите попробовать.
При этом насмешливый метод ассоциации должен работать так, как показано в вашем примере, но вам также необходимо заменитьфактический объект ассоциации с вашей имитацией, потому что, в отличие от моделей, ассоциации не имеют глобального реестра, в который можно было бы поместить макеты (это то, что getMockForModel()
сделает для вас), так что код вашего приложения будет использовать их без дальнейшего вмешательства.
Что-то вроде этого должно сделать это:
$KeywordsAssociationMock = $this
->getMockBuilder(BelongsToMany::class) /* ... */;
$associations = $this
->getTableLocator()
->get('Items')
->associations();
$associations->add('Keywords', $KeywordsAssociationMock);
Это изменит объект таблицы Items
в реестре таблиц и заменит ее (add()
коллекции ассоциации действует больше как установщик, т.е.он перезаписывает) свою фактическую Keywords
связь с высмеянным.Если вы используете это вместе с имитацией Items
, то вы должны убедиться, что макет Items
был создан заранее, иначе таблица, полученная в приведенном выше примере, не была бы имитированной!