On Wednesday, July 9, 2014 1:24:33 PM UTC-7, Javix wrote:
>
> I can't figure out why my example fails sometimes and sometimes not:
>
> describe ClientsController do
> let(:admin) { create(:admin) }
>
> before(:each) { sign_in admin }
>
> describe 'GET #index' do
> Client.delete_all
> let!(:clients) { Array.new(3) { create(:client) } }
> it "populates an array of all clients" do
>
> get :index
> expect(assigns(:clients)).to match_array(clients)
> end
>
> it "renders the :index template" do
> get :index
> expect(response).to render_template :index
> end
> end
> end
>
> I set up DatabaseCleaner as follows in spec_helper:
>
> config.before(:suite) do
> DatabaseCleaner.clean_with(:truncation)
> end
>
> config.before(:each) do
> DatabaseCleaner.strategy = :transaction
> end
>
> config.before(:each, js: true) do
> DatabaseCleaner.strategy = :truncation
> end
>
> config.before(:each) do
> DatabaseCleaner.start
> end
>
> config.after(:each) do
> DatabaseCleaner.clean
> end
>
> and set up fixtures to false as well (spec_helper):
>
> config.use_transactional_fixtures = false
>
> No matter if I keep the line or not:
>
> Client.delete_all
>
> it fails the first time (when I run all the tests) and passes when I run
> the spec separately.
>
> I also defined a shared_db_connection in support folder:
>
> class ActiveRecord::Base
> mattr_accessor :shared_connection
> @@shared_connection = nil
>
> def self.connection
> @@shared_connection || retrieve_connection
> end
> end
> ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
>
> For a more complete description of this setup, check out Avdi Grimm’s
> Virtuous Code blog:
>
> http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
>
> Any idea? THANK YOU
>
The `Client.delete_all` line is problematic in that it runs at spec file
load time, and many other examples can be run between that point and the
examples you've listed run. If any other examples create client records
you're going to hit problems like you're seeing. Instead, wrap it in a
`before(:all)` hook if you want it to run once before all examples in that
group.
That said, I question the need for it at all; your environment is setup to
truncate the DB before the first example runs and then wrap each example in
a transaction, so there shouldn't be any client records in the DB to be
deleted...unless you have some records being put into the DB outside the
scope of an example (e.g. in an example group body or a `before(:all)`
hook). And if you do have that kind of thing -- well, that's probably
what's causing the problem.
HTH,
Myron
--
You received this message because you are subscribed to the Google Groups
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rspec/99fcd847-9c68-4684-a396-4157d9412816%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.