如何让 1 个数据集始终与 database_cleaner 和 factorygirl 一起出现
how to have 1 dataset always present with database_cleaner and factorygirl
我们有一个多域应用程序,其中每个站点可以有多个域(针对语言环境)
ApplicationController 正在做
def load_site
@site = Site.find_by!("domains like '%#{request.host}%'")
end
在我的测试套件中,我只想确保该网站正在显示
spec/features/user_visits_homepage_spec.rb
require "rails_helper"
feature "User visits Homepage" do
site = FactoryGirl.create :site
scenario "successfully", js: true do
visit root_path
expect(page).to have_css "h1", text: site.name
end
end
我的database_cleaner.rb
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
问题
我如何确保我始终拥有 1 个站点,因为没有站点,控制器将无法工作。
当我像以前那样创建网站时,database_cleaner 总是会杀死它。
是我理解有误还是漏掉了什么?
您的数据库清理器有两个条目与您的问题相关,前两个。
在整个套件之前,您通过截断来清理整个数据库。然后,每个测试都包含在一个事务中。这将导致在每次测试后恢复到初始状态。要设置一些持久数据,只需在初始清理后立即执行,如下所示:
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
# Add setup data here which will persist through all tests (unless deleted or modified)
end
注意不要在所有测试中使用此数据。这应该只用于为您的应用程序运行建立一个最小框架。例如,在那里创建一个站点,但是在测试站点管理的 CRUD 操作时,在单独的站点上进行。
我们有一个多域应用程序,其中每个站点可以有多个域(针对语言环境)
ApplicationController 正在做
def load_site
@site = Site.find_by!("domains like '%#{request.host}%'")
end
在我的测试套件中,我只想确保该网站正在显示
spec/features/user_visits_homepage_spec.rb
require "rails_helper"
feature "User visits Homepage" do
site = FactoryGirl.create :site
scenario "successfully", js: true do
visit root_path
expect(page).to have_css "h1", text: site.name
end
end
我的database_cleaner.rb
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
问题
我如何确保我始终拥有 1 个站点,因为没有站点,控制器将无法工作。
当我像以前那样创建网站时,database_cleaner 总是会杀死它。
是我理解有误还是漏掉了什么?
您的数据库清理器有两个条目与您的问题相关,前两个。
在整个套件之前,您通过截断来清理整个数据库。然后,每个测试都包含在一个事务中。这将导致在每次测试后恢复到初始状态。要设置一些持久数据,只需在初始清理后立即执行,如下所示:
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
# Add setup data here which will persist through all tests (unless deleted or modified)
end
注意不要在所有测试中使用此数据。这应该只用于为您的应用程序运行建立一个最小框架。例如,在那里创建一个站点,但是在测试站点管理的 CRUD 操作时,在单独的站点上进行。