Спецификация RSpec System может видеть заводские данные из модели, но не из вида - PullRequest
0 голосов
/ 15 июня 2019

У меня есть системная спецификация, где я называю 3 фабрики: Компания has_many Магазины has_many Полки

В приведенном ниже коде я размещаю отладчик как в спецификации, так и в ApplicationController. При вызове из спецификации все фабрики создаются, как ожидается. Затем, когда я посещаю root_url, я не могу найти те же записи (или вообще никаких записей): - Company.count возвращает 0 - Магазин (find_by: id) возвращает ноль (используя идентификатор магазина, созданного фабрикой)

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

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

Спецификация:

RSpec.describe "changing the current shop", type: :system do
  let(:company) { create(:company, name: "Test co") }
  let(:first_shop) { create(:shop_with_shelves, name: "seeded shop", company: company) }
  let(:last_shelf) { create(:standby_shelf, name: "Cool Shelf", shop: first_shop) }

it "displays the name of the current shop" do
  first_shop
  last_shelf
  # debugger here identifies all models created as expected
  visit root_path
end

the helper_method:

class ApplicationController < ActionController::Base
  helper_method :current_shop

  def current_shop
    # debugger here is unable to find any models Company.count = 0
    @current_shop ||= Company.first.current_shop
  end
end

в представлении это:

<%= current_shop.name %>

Ошибка / Ошибка: @current_shop || = Company.first.current_shop

 NoMethodError:
   undefined method `current_shop' for nil:NilClass

Если при дальнейшем тестировании я смог увидеть, что системные спецификации вызывают эту ошибку, но технические характеристики не соответствуют приведенным ниже:

RSpec.describe "trying a system spec (this fails)", type: :system do
  let!(:company) { create(:company) }
  let!(:shop) { create(:shop, company: company, is_current: true) }
  it "gets to the shops page" do
    visit shops_path  
  end
end

RSpec.feature "trying a feature spec (this passes)", type: :feature do
  let!(:company) { create(:company) }
  let!(:shop) { create(:shop, company: company, is_current: true) }
  scenario "gets to the shops page" do
    visit shops_path  
  end
end

1 Ответ

0 голосов
/ 25 июня 2019

Ваше приложение и тесты имеют собственное подключение к базе данных. Предполагая, что вы используете современную версию Rails (5.1+), вам нужно включить транзакционные тесты и разделить соединение БД между приложением и тестами.

...