Я получаю 'KeyError: Factory notistered: "user" "в тесте контроллера с RSpec и Factory-bot-rails - PullRequest
0 голосов
/ 05 мая 2019

Я работаю в приложении ToDo, и у меня возникает ошибка при запуске моих тестов для контроллеров с FactoryBot.

Приложение находится в Ruby on Rails, с Postgres в качестве DB, RSpec и Shoulda-Matchers для тестирования и FactoryBot-Rails.

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

Когда я запускаю тест моего контроллера списков, я получаю ошибку 'KeyError: Фабрика не зарегистрирована: "пользователь"'

Я читал много блогов здесь, в StackOverflow и на других страницах, и попробовал все найденные решения, в том числе:

  • Я убедился, что использовал 'factory_bot_rails' в моем Gemfile
  • Попробуйте файл с именем 'фабрики' в моей папке спецификации
  • Попробуйте файл с именем user.rb в 'spec / factories / user.rb'
  • Попробуйте использовать 'factory_girl_rails' (теперь я знаю, что это FactoryBot, но я пытался)
  • Изменить тест с использованием и без использования горчицы
  • Изменить тип теста
  • Несколько или только 1 тест одновременно
  • Требовать 'factory_bot_rails' в моем файле spec_helper.rb
  • Требовать, чтобы мой файл или папка фабрики были в моем тестовом файле
  • Включить "Синтаксис :: Методы" в мой файл rails_helper

Определение фабрики 'user' в 'spec / factories.rb'

FactoryBot.define do 
  factory :user do
    first_name { "User1" }
    last_name { "UserLastName" }
    description { "A big guy" }
    email { "test@example.com" }
    password { "012345" }
  end
end

индекс для отображения в 'lists_controller.rb'

before_action :authenticate_user!
def index
  @lists = current_user.lists
end

Определение пользователя для теста и test render_template индекса в 'lists_controllers_spec.rb'

require 'rails_helper'
require 'factories/user'

RSpec.describe ListsController, type: :controller do

  let(:user) { create(:user) }
  let(:list) { create(:list, user: user) }

  before do 
    sign_in user 
  end

  describe 'Get #index' do
    before { get :index }
    it { should render_template(:index) }
  end
end

В Gemfile я определил

group :development, :test do
  gem 'factory_bot_rails'
end

rails_helper.rb

require 'spec_helper'

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production 
abort("The Rails environment is running in production mode!") if ails.env.production?

require 'rspec/rails'

begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true

  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!

  config.include Devise::Test::ControllerHelpers, type: :controller 
  config.include Devise::Test::IntegrationHelpers, type: :request 

  Shoulda::Matchers.configure do |config|
    config.integrate do |with|
      with.test_framework :rspec
      with.library :rails
    end
  end
end

Я ожидаю, что при тестировании будет отображаться, что рендер индекса работает, но всегда получаю

Failures:

  1) ListsController Get #index 
    Failure/Error: let(:user) { create(:user) }

    KeyError:
      Factory not registered: "user"
    # ./spec/controllers/lists_controller_spec.rb:14:in `block (2 levels) in <top (required)>'
    # ./spec/controllers/lists_controller_spec.rb:18:in `block (2 levels) in <top (required)>'
    # ------------------
    # --- Caused by: ---
    # KeyError:
    #   key not found: "user"
    #   ./spec/controllers/lists_controller_spec.rb:14:in `block (2 levels) in <top (required)>'

Finished in 0.00451 seconds (files took 1.04 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/lists_controller_spec.rb:30 # ListsController Get #index

spec_helper.rb

require 'factory_bot_rails'
RSpec.configure do |config|

  config.before(:all) do
    FactoryBot.reload
  end

  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.shared_context_metadata_behavior = :apply_to_host_groups
end

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

** Решение **

Пытаясь загрузить свой проект в Heroku, я получаю эту ошибку о Factory:

NoMethodError: неопределенный метод `factory_bot 'для

По-видимому, у меня была строка `config.factory_bot.definition_file_paths = ['custom / factories']` в конце моего модуля внутри applications.rb в папке конфигурации.

После удаления этой строки возникла проблема «пользователя»больше никогда не появлялся, и я смог продолжить тест.

Большое спасибо тем, кто пытался мне помочь !!

0 голосов
/ 06 мая 2019

Я думаю, что ваша проблема может возникнуть в следующей строке

let(:list) { create(:list, user: user) }

возможно сделать let(:list) { create(:list, user_id: user.id) }, если вы ссылаетесь на пользователя из таблицы списка, используя user_id

прочитайте сообщение об ошибке, которое жалуется на ключ user, который user:

надеюсь, что поможет :)

...