Я работаю в приложении 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