factory_girl + rspec doesn't seem to roll back changes after each example

旧街凉风 提交于 2019-12-03 04:57:12

Things i think off:

  • do you use rake spec to run your testsuite: that builds up the database from scratch (to make sure nothing is sticking)
  • do you use, anywhere, a before (:all) ? Because whatever you create inside a before :all should be deleted again in a after :all or it keeps on existing.

Question: Shouldn't rspec clear database before each spec example and hence not throwing duplicate entry errors?

RSpec with DatabaseCleaner or RSpec Rails with use_transactional_fixtures will clear the DB as long as your created the data in the example itself. before :all do ... end is considered outside of the example, because the data remains untouched across multiple examples. Whatever you create in before :all you have to delete in after :all.

In order to delete whatever you create automatically use before :each do ... end. Be aware the same data will be created and removed 10 times if you have 10 examples. The difference between before :all and before :each is better explained here: rails rspec before all vs before each

Some more possible causes:

  • There's still a states.yml fixture sitting around
  • Someone played around on script/console test and forgot to clean up afterwards.
Peter Nixey

You might also find it's because you haven't wrapped the statement in:

describe "what it should do" do
  @static_model = Factory(:state) # with validate uniqueness of state name
end

I discovered that was the change that solved this problem: Why isn't factory_girl operating transactionally for me? - rows remain in database after tests

I have had similar questions about what sort of starting state one can expect when using FG and RSpec.

While I too wait for clarity, Database Cleaner could be a good fix: http://rubydoc.info/gems/database_cleaner/0.6.7/frames hth - Perry

When you use Factory(:state) wich is a shortcut to Factory.create(:state), factory_girl returns you a saved object.

Use Factory.build(:state) instead.

Dude maybe your yaml fixtures from regular unit tests get mixed into your rspec?

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!