капибара have_title NoMethodError

На данный момент это простой проект — всего пара статических страниц. Я разрабатываю общую тестовую среду, но изо всех сил пытаюсь различать разные варианты тестирования. Я добавил Rspec, Capybara, Faker, Factory Girl, Spring и shoulda (хотя в данный момент я не использую сопоставители shoulda).

У меня есть этот тестовый файл контроллера:

require 'rails_helper'

RSpec.describe StaticPagesController, type: :controller do

  describe "GET #a_page" do
    before(:each) { get :a_page }

    it "returns http success" do
      expect(response).to have_http_status(:success)
    end
    it "has a page title Static Site" do 
      expect(response).to have_title('Static Site') 
    end 
  end

end

Когда это проходит через guard, он выдает стек ошибок:

23:13:39 - INFO - Run all
23:13:39 - INFO - Running all specs
Running via Spring preloader in process 4498
Running via Spring preloader in process 4506
/home/steve/workspaces/static_site/db/schema.rb doesn't exist yet. Run `rake db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /home/steve/workspaces/static_site/config/application.rb to limit the frameworks that will be loaded.
.F

Failures:

  1) StaticPagesController GET #a_page has a page title Static Site
     Failure/Error: expect(response).to have_title('Static Site')

     NoMethodError:
       undefined method `match' for nil:NilClass
       Did you mean?  catch
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/capybara-2.7.1/lib/capybara/queries/title_query.rb:18:in `resolves_for?'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/capybara-2.7.1/lib/capybara/node/document_matchers.rb:20:in `block in assert_title'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/capybara-2.7.1/lib/capybara/node/simple.rb:144:in `synchronize'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/capybara-2.7.1/lib/capybara/node/document_matchers.rb:19:in `assert_title'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/capybara-2.7.1/lib/capybara/rspec/matchers.rb:105:in `matches?'
     # ./spec/controllers/static_pages_controller_spec.rb:34:in `block (3 levels) in <top (required)>'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-commands-rspec-1.0.4/lib/spring/commands/rspec.rb:18:in `call'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/command_wrapper.rb:38:in `call'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:191:in `block in serve'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:161:in `fork'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:161:in `serve'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:131:in `block in run'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:125:in `loop'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application.rb:125:in `run'
     # /home/steve/.rvm/gems/ruby-2.3.1/gems/spring-1.7.1/lib/spring/application/boot.rb:19:in `<top (required)>'
     # -e:1:in `<main>'

Finished in 0.029 seconds (files took 2.54 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./spec/controllers/static_pages_controller_spec.rb:33 # StaticPagesController GET #a_page has a page title Static Site

Первый тест работает нормально, а без второго я получаю чистый результат. Я потратил много времени на просмотр своей конфигурации, и она выглядит нормально. Я также просмотрел документы и некоторые сайты поддержки.

Кто-нибудь может помочь?


person Steve Roach    schedule 27.06.2016    source источник


Ответы (2)


Сопоставители Capybara необходимо вызывать для элемента документа html/xml (или строки, которая преобразуется в документ), а не для объекта ответа. По умолчанию сопоставители Capybaras обычно доступны только в спецификациях функций и представлений (но не в контроллере). Была ли какая-то особая причина, по которой вы включили их в спецификации контроллера? Проверка заголовка страницы действительно должна быть больше связана со спецификацией представления, чем с контроллером (по умолчанию представления не отображаются в спецификациях контроллера — https://www.relishapp.com/rspec/rspec-rails/docs/спецификацииконтроллера).

person Thomas Walpole    schedule 27.06.2016
comment
Спасибо за отзыв - это логично. Прочитав много об этом, я думаю, что склонен создавать тесты только для моделей, контроллеров (за исключением типа теста, который я предложил в OQ) и функций. Тесты View, похоже, не приносят многого, поэтому я не думаю, что буду с ними заморачиваться. Это звучит правильно? - person Steve Roach; 29.06.2016
comment
@SteveRoach Напишите любые тесты, которые помогут вам быть более продуктивными. Единственное преимущество тестов просмотра перед тестами функций заключается в том, что они, как правило, намного быстрее, но они начинают терять свою полезность по мере того, как ваши страницы становятся все более ориентированными на JS, поскольку они могут действительно проверять только статические содержание. Лично я считаю, что TDD подтолкнул многих людей к чрезмерному тестированию. - person Thomas Walpole; 29.06.2016
comment
Спасибо за это, Том. Я думаю, что я буду больше полагаться на тесты функций, а не на просмотр, в основном, чтобы иметь только один подход для всего. Я надеюсь преуспеть только в одном деле. Может быть, в будущем я немного перепутаю. Я пока буду жить с проблемой скорости. Я пытаюсь добиться правильного баланса тестирования, и я думаю, что это тоже придет с большим опытом. А пока я пытаюсь поставить библиотеку стандартных (для меня) тестов, которые дали бы мне хорошую основу для любого проекта. Затем опирайтесь на это. Спасибо за отзыв - все хорошо. - person Steve Roach; 02.07.2016