使用Capybara和RSPEC时,数据库未被清除

时间:2012-07-09 19:11:54

标签: rspec capybara factory-bot

我最近在使用我的数据库时遇到了一些问题。起初我认为这是一个女工问题,但后来我意识到工厂女孩(可能)实际上并没有使用未被清除的数据。

无论如何,我首先使用factorygirl来创建一个新用户。然后我以用户身份登录并导航到我可以使用数据字段“foo_name”和“bar”创建新“foo”的页面。接下来,我填写“”。 :with => “”字段和click_button“保存”以创建新的“foo”对象。之后,我检查新对象的索引,它应该是1,但每次运行测试时,数字都会增加4.(现在是72)

此外,我发现我需要在测试开始时删除旧用户,否则factorygirl会抱怨用户已经创建。

我几乎可以肯定RSPEC应该为我处理测试数据库的删除,我错了吗?如果是这样,有人会对清除数据库的“好”方法有一些好的建议吗?我已经好好看了好几天了,到目前为止它真的很糟糕。

非常感谢。

编辑(请求的一些示例代码):

...
  context "can create a new FooBar" do
    before {
      find_link('New Foo Bar').click
    }
    it 'has current_path "/foo_bar/new"' do
      current_path.should == '/foo_bar/new'
    end
    context "when the correct information is given" do
      before {
        fill_in 'Name', :with => 'TestFooBar'
        fill_in 'Description', :with => 'A test foo bar'
        click_button 'Save'
      }
      it 'has current_path "/foo_bars"' do
        current_path.should == '/foo_bars'
      end
...

在此之后,我检查有多少foo_bars

2 个答案:

答案 0 :(得分:3)

对于将来需要此功能的人来说,这个问题已经解决了。 就像zetetic所说的那样,我不能将Capybara与交易装置一起使用。

要解决此问题,我使用了数据库清理程序。

gem install database_cleaner

Gemfile:
group :test do
  gem 'database_cleaner'
end

捆绑安装

规格/ spec_helper.rb:

config.use_transactional_fixtures = false
...
module ::RSpec::Code
  class ExampleGroup
    include Capybara::DSL
    include Capybara::RSpecMatchers
  end
end

foo_bar文件:

before(:all) {
  ...
  DatabaseCleaner.strategy = :truncation
}
after(:all) {
  ...
  DatabaseCleaner.clean
  Capybara.reset_sessions!
  Capybara.use_default_driver
}

答案 1 :(得分:1)

您的规范不应该依赖于使用ID == 1创建第一行的假设。

对于清理测试数据库,通常RSpec通过运行事务中的每个规范来处理这个问题,并在示例完成时回滚更改。如果您的配置包含以下行,则会发生这种情况:

config.use_transactional_fixtures = true

如果您需要将此设置为false,则可以使用Database Cleaner之类的工具在每个示例后清除数据库。