<rmcreative>

RSS

Как получить mock из ActiveRecord

5 июля 2016

На тостере в комментариях к вопросу спросили, как получить mock ActiveRecord, чтобы он не пытался лезть в базу и возможно ли.

Возможно. В случае PHPUnit делается так:

$post = $this->getMockBuilder('\app\model\Post')
    ->setMethods(['save', 'attributes'])
    ->getMock();
$post->method('save')->willReturn(true);
$post->method('attributes')->willReturn([
    'id',
    'status',
    'title',
    'description',
    'text'
]);

Особенность заключается в том, что перекрыть надо ещё и метод attributes() потому как ActiveRecord лезет за схемой в базу данных, что нам не нужно.

Комментарии RSS

  1. №10577
    Александр
    Александр 08 июля 2016 г., 23:05:09

    Добавьте в cookbook, самое место там.

  2. №10579
    Sam
    Sam 11 июля 2016 г., 18:05:51

    Добавлю.

  3. №10581
    Владислав
    Владислав 11 июля 2016 г., 22:48:48

    Александр, правильно ли я понимаю, что описанный мок полностью исключает поход в БД со стороны AR? Что будет, например, при попытке загрузить relation?

  4. №10583
    Sam
    Sam 13 июля 2016 г., 2:39:29

    Владислав, начнёт грузить. Чтобы relation перекрыть, нужно ещё немного постараться.

  5. №10650
    corpsee
    corpsee 24 авг. 2016 г., 9:15:38

    Sam, а как сделать тоже самое для AR из 1го Yii? У меня сходу не получилось сделать нормальный мок.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.