Rails 3 RSpec и assert_select - PullRequest
       2

Rails 3 RSpec и assert_select

9 голосов
/ 07 февраля 2012

Я подумал, чтобы попытаться использовать Rspec.Но у меня возникает следующая проблема с assert_select.

1) UserController login page open login page contains all expected controls
Failure/Error: assert_select "form[action=?]", "/user/login" do MiniTest::Assertion:
Expected at least 1 element matching "form[action='/user/login']", found 0.
# (eval):2:in `assert'
# ./spec/controllers/user_controller_spec.rb:20:in `block (3 levels) in <top (required)>'

Это мой фрагмент кода

describe UserController do
  describe "login page open" do
    it "login page contains all expected controls" do
      get :login
      assert_select "form[action=?]", "/user/login" do
      assert_select "input[name=?]", "username"
      assert_select "input[name=?]", "password"
      assert_select "input[type=?]", "submit"
    end
  end
end

Когда я открываю страницу входа в браузере, эта страница открывается без проблем.

Ответы [ 2 ]

17 голосов
/ 29 сентября 2012

По умолчанию RSpec (по крайней мере, в более новых версиях) запрещает Rails отображать представления при запуске спецификаций контроллера. Они хотят, чтобы вы протестировали свои представления в виде спецификаций, а не контроллеров. Поскольку представления не отображаются, assert_select всегда завершается ошибкой.

Но для людей, которые (как и я) хотят проверить случайный фрагмент представления в своих спецификациях контроллера, они предоставляют метод render_views. Вы должны вызывать его в своем блоке describe или context, но не внутри блока it.

describe UserController do

  render_views       # <== ADD THIS

  describe "login page open" do
    it "login page contains all expected controls" do
      get :login
      assert_select "form[action=?]", "/user/login" do
      assert_select "input[name=?]", "username"
      assert_select "input[name=?]", "password"
      assert_select "input[type=?]", "submit"
    end
  end
end
1 голос
/ 08 августа 2013

Тесты контроллеров предназначены для тестирования контроллеров.

assert_select соответствует чему-то, что находится в вашем коде представления.

Хорошая идея - держать ваши контроллеры отдельно от ваших представлений, включая тесты, выполненные на контроллерах и представлениях.Вы должны использовать assert_select в тесте представлений (те, которые обычно на spec/views), а не в тестах вашего контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...