我最近在使用我的数据库时遇到了一些问题。起初我认为这是一个女工问题,但后来我意识到工厂女孩(可能)实际上并没有使用未被清除的数据。
无论如何,我首先使用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
答案 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之类的工具在每个示例后清除数据库。