我使用rspec-rails测试我的rails应用程序中的控制器。在一个实例中,我创建新对象以测试它们是否已正确分配给实例变量。
describe MainController do
describe "GET #index" do
it "properly assigns a colored ball" do
ball1 = Ball.create(color: 'red')
get :index
expect(assigns(:red_balls)).to eq([ball1])
end
end
end
当我运行测试时,rspec是否访问数据库以创建ball1,然后在测试运行后将其删除?
答案 0 :(得分:0)
从您问题的摘录中,是Rspec
访问database.yml
文件中配置为test的数据库,如果您要清除Rspec
创建的数据库/记录,则可以使用database_cleaner gem您可以根据自己的需要配置它。
e.g:
将gem database_cleaner
添加到您的Gemfile
以及spec_helper.rb
文档中指定的database_cleaner
文件的下方:
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
然后database_cleaner
将截断test db
中的表并将它们置于原始状态
答案 1 :(得分:0)
添加到bjhaid上面说的内容 - Rspec应该只访问你的'test'数据库。查看config / database.yml以查看不同数据库的配置。
因此,您不必担心开发或生产数据库中的内容会干扰您的测试数据库。
答案 2 :(得分:0)
是的,RSpec允许您的数据库调用通过,但是使用默认配置下的rspec-rails gem,它将在数据库事务中执行每个测试,并在每个示例的末尾回滚该事务而不执行任何操作你需要的。不需要额外的宝石。请参阅https://relishapp.com/rspec/rspec-rails/docs/transactions。