Торт 3: имитация поведения модели

В Cake 3 я тестирую поведение. Теперь я хочу проверить, хорошо ли используется поведение при сохранении через модель. Для этого мне нужно издеваться над некоторыми методами поведения.

Я искал много способов, как издеваться над ними и добавлять их в модель. В Cake 2.x мы смогли зарегистрировать пользовательское поведение через файл ClassRegistry. Я искал, как это сделать в Cake 3, но не смог найти.

Любой орган знает, как это сделать?

Спасибо


person Bob    schedule 03.03.2015    source источник


Ответы (1)


Вы можете просто добавить моки вручную в реестр поведения таблиц, используя ObjectRegistry::set(), который позволяет добавлять произвольные объекты.

$table = TableRegistry::get('FooBars');
$behaviorOptions = [];

$behaviorMock = $this->getMock(
    '\App\Model\Behavior\BazBehavior',
    ['some', 'mocked', 'methods'],
    [$table, $behaviorOptions]
);

$table->behaviors()->set('Baz', $behaviorMock);

Теперь ваше издевательское поведение зарегистрировано в таблице как Baz.

person ndm    schedule 04.03.2015
comment
$table->behaviors()->set( это то место, где я искал все время :) спасибо! - person Bob; 04.03.2015
comment
Я использовал следующий код: $table->behaviors()->set('Baz', $behaviorMock);. Получил эту ошибку: Fatal error: Call to a member function set() on null - person Bob; 04.03.2015
comment
@Bob Ну, отсюда я мало что могу сделать, проверьте, почему это null, по умолчанию класс таблицы конструктор создает экземпляр \Cake\ORM\BehaviorRegistry, если ему не передана опция behaviors. - person ndm; 04.03.2015
comment
Это сложно: когда вы оставляете массив, в котором вы размещаете имитируемые методы, пустым ('some', 'mocked', 'methods'), он автоматически имитирует все методы;) Хитро и не чисто? - person Bob; 04.03.2015
comment
@Bob Если вы не хотите издеваться над какими-либо методами, вам нужно передать null, а не пустой массив - person ndm; 04.03.2015
comment
о, круто! Дальше звучит логично :P - person Bob; 04.03.2015