Можно ли использовать Post.first вместо assigns(:post) в тесте контроллера?

В приложении rails (4.2.x), в тестах контроллеров, я вижу много примеров, когда они используют assigns(:post)где я мог бы использовать Post.first или же Post.find_by(title: 'foo') вместо. Я не понимаю необходимости assigns совсем. (Я слышал, что присвоения будут устаревшими в рельсах 5, но до тех пор нормально ли использовать объект напрямую?) Это неправильно, например:

assert_redirected_to(post_path(Post.first))

вместо:

assert_redirected_to(post_path(assigns(:post))

2 ответа

Решение

assigns(:post) это просто ссылка на переменную действия @post, Действие может выглядеть так:

@post = Post.first

или же:

@post = Post.find_by(title: 'foo')

В тесте через assigns(:post) Вы можете получить @post переменная из действия контроллера.

С помощью Post.first возможно, но соединяет ваш тест с реализацией базы данных. Вы тестируете функциональность контроллера, поэтому вы можете отключить вызов БД и ускорить ваш тест.

Потушение этого вызова будет выглядеть примерно так:

before { allow(Post).to_receive(:find){ build :post } }

В этом случае спецификации вашего контроллера будут продолжать работать, если вы проверите assigns(:post), но они сломаются, если вы проверите Post.first

Другие вопросы по тегам