在每个示例之后,factory_girl + rspec似乎没有回滚更改
与此处描述的问题类似: http : //rpheath.com/posts/411-how-to-use-factory-girl-with-rspec
简而言之(缩短代码):
spec_helper:
config.use_transactional_fixtures = true config.use_instantiated_fixtures = false
factories.rb:
Factory.define :state do f.name "NY" end
在我的规范中
before(:each) do @static_model = Factory(:state) # with validate uniqueness of state name end
错误:
重复的条目名称“NY”等。
问题:在每个规范示例之前,不应该rspec清除数据库,因此不会抛出重复的条目错误吗?
我想的事情:
- 你使用
rake spec
来运行你的测试套件:从头开始构建数据库(以确保没有任何东西粘在一起) - 你在任何地方使用
before (:all)
吗before (:all)
? 因为你在before :all
创建的内容before :all
应该在after :all
再次删除after :all
或者它保持存在。
问题:在每个规范示例之前,不应该rspec清除数据库,因此不会抛出重复的条目错误吗?
带有DatabaseCleaner的RSpec或带有use_transaction_fixtures的RSpec Rails 将清除DB ,只要您在示例中创建了数据。 before :all do ... end
被认为是在示例之外,因为数据在多个示例中保持不变。 无论你before :all
创造什么before :all
你必须在after :all
删除after :all
。
为了删除你before :each do ... end
自动创建的内容before :each do ... end
。 请注意,如果您有10个示例,则会创建和删除相同的数据10次。 before :all
和before :each
的区别before :each
都在这里更好地解释: 在每个之前的所有vs之前的rails rspec
更多可能的原因:
- 还有一个states.yml夹具坐着
- 有人玩过脚本/控制台测试,之后忘了清理。
您可能也会发现它是因为您没有将声明包装在:
describe "what it should do" do @static_model = Factory(:state) # with validate uniqueness of state name end
我发现这是解决这个问题的变化: 为什么factory_girl不能为我进行交易操作? – 测试后行仍保留在数据库中
关于使用FG和RSpec时可以预期的起始状态,我有类似的问题。
虽然我也等待清晰,但数据库清理程序可能是一个很好的解决方案: http: //rubydoc.info/gems/database_cleaner/0.6.7/frames hth – Perry
当您使用Factory(:state)时,它是Factory.create(:state)的快捷方式,factory_girl会返回一个保存的对象。
请改用Factory.build(:state)。
老兄,也许你的常规unit testing你的yaml灯具会混入你的rspec?