undefined метод `visit 'для []: массив в тестах возможностей RSpec 3 в 2019 году - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь запустить этот самый простой из функциональных тестов.С синтаксисом RSpec 3, ruby-2.5.1, rails 5, как в 2019 году:

RSpec.feature "Roots", type: :feature do
  fixtures :page_model
  fixtures :event
  fixtures :level
  fixtures :phase

  it "loads the homepage" do
    visit root_path
    expect(page).to have_content 'Team'
  end

  it "loads a page" do
    p = page(:page2)
    puts p.name
    visit page_path(p)
    expect(page).to have_content p.body
  end
end

Но я всегда получаю ошибку

 NoMethodError:
   undefined method `visit' for []:Array
 # /Users/someuser/.rvm/gems/ruby-2.5.1@rails5/gems/capybara-3.16.1/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
 # ./spec/features/root_spec.rb:10:in `block (2 levels) in <top (required)>'

Обратите внимание, что ошибка возникает в строке

visit root_path

, который вообще не имеет отношения к страницам.

Я сузил его до первого файла фикстур: если я закомментирую его

RSpec.feature "Roots", type: :feature do
  # fixtures :page
  fixtures :event
  fixtures :level
  fixtures :phase

  it "loads the homepage" do
    visit root_path
    expect(page).to have_content 'Team'
  end
end

тогда тест выполняется без ошибок и успешноНо я не могу найти проблему с файлом фикстуры:

page1:
  id: 1
  cached_slug: info
  name: "Information"
  body: "this and that"
  created_at: "2011-03-01 10:09:53"
  updated_at: "2016-07-21 12:15:46"
  visibility: visibility_public

page2:
  id: 2
  cached_slug: impressum
  name: "Impressum + Kontakt"
  body: "dies ist ein Projekt"
  created_at: "2011-03-01 10:09:53"
  updated_at: "2016-12-05 10:42:30"
  visibility: visibility_public

1 Ответ

0 голосов
/ 09 апреля 2019

Светильник нельзя назвать page.yml, потому что это создает метод page() для загрузки с крепежа. Это переопределяет page это неявно устанавливается visit: объект, представляющий страницу это было только что загружено.

Мне пришлось изменить имя файла файла фикстуры на page_model.yml, и загрузить это вместо:

RSpec.feature "Roots", type: :feature do
  fixtures :page_model
  fixtures :event
  fixtures :level
  fixtures :phase

  it "loads the homepage" do
    visit root_path
    expect(page).to have_content 'Team'
  end

  it "loads a page" do
    p = page_model(:page1)
    puts p.name
    visit page_path(p)
    expect(page).to have_content p.body
  end
end

Обратите внимание, что теперь я могу использовать page_model(:page1) для загрузки прибора.

В Установить название модели в приборах в качестве метаданных Я узнал, что Вы можете указать класс модели в файле прибора:

_fixture:
  model_class: Page

page1:
  id: 1
  cached_slug: info
  name: "Information"
  body: "this and that"
  created_at: "2011-03-01 10:09:53"
  updated_at: "2016-07-21 12:15:46"
  visibility: visibility_public

page2:
  id: 2
  cached_slug: impressum
  name: "Impressum + Kontakt"
  body: "dies ist ein Projekt"
  created_at: "2011-03-01 10:09:53"
  updated_at: "2016-12-05 10:42:30"
  visibility: visibility_public
...