运行测试时rspec是否访问数据库?

时间:2014-01-25 20:47:04

标签: ruby-on-rails ruby rspec

我使用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,然后在测试运行后将其删除?

3 个答案:

答案 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