1

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

无论如何,我首先使用 factorygirl 创建一个新用户。然后,我以用户身份登录并导航到可以使用数据字段“foo_name”和“bar”创建新“foo”的页面。接下来,我填写“”。:with => "" 字段和 click_button "Save" 创建新的 "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

4

2 回答 2

3

对于将来需要此功能的任何人,此问题已得到解决。就像 zetetic 所说,我不能将 Capybara 与事务性装置一起使用。

为了解决这个问题,我使用了 Database Cleaner。

宝石安装 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
}
于 2012-07-10T19:00:56.837 回答
1

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

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

config.use_transactional_fixtures = true

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

于 2012-07-09T23:00:29.010 回答