在每个示例之后,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 :allbefore :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?