Можно ли использовать 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