On 16 Jul 2014, at 22:28, Myron Marston <[email protected]> wrote:

> On Tuesday, July 15, 2014 11:16:53 PM UTC-7, Javix wrote:
> 
> On 16 Jul 2014, at 05:06, Aaron Kromer wrote:
> 
>> This is caused by your use of before(:all) blocks which create data in the 
>> database. If you are using the :transaction strategy, which it seems you 
>> are, then any data added in before(:all) is created prior to the 
>> transaction. This also means it's left over after the example. I'm guessing 
>> you want to use the :all block for "performance reasons". However, that may 
>> not be where your time is being spent. For example, your "Clients Page Has 
>> pagination and lists all clients" spec 
>> (spec/features/clients_page_spec.rb:24) took 13.25 seconds on my machine. 
>> That time was not spent creating the objects, but instead verifying 
>> everything on the page.
>> 
>> If you really must use before(:all) then you need to manually clean it up or 
>> change your configs. See the following references for more info:
>> 
>> http://toctan.com/articles/be-careful-with-before(:all)-in-rspec/
>> https://groups.google.com/forum/#!topic/database_cleaner/qUp5Hp6N0eY
>> http://www.ultrasaurus.com/2014/01/rspec-mixing-transcations-truncation-database-clearner-strategies/
>> 
>> 
>> On Tue, Jul 15, 2014 at 4:58 PM, Myron Marston  wrote:
>> On Tuesday, July 15, 2014 12:48:56 AM UTC-7, Javix wrote:
>> 
>> 
>> On Wednesday, July 9, 2014 10:24:33 PM UTC+2, 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
>> 
>> 
>> @Myron: I pushed to remote a branch that has RSpec features implemented. 
>> When running all the specs, tests failed (2). When running the same but 
>> separately, they pass.
>> 
>> You can clone the branch from 
>> https://github.com/Javix/jlc-invest/tree/rspec_features_back
>> 
>> Thank you. 
>> 
>> Thanks.  I cloned it and tried to run your specs, but I'm getting 187 
>> failures out of 190 specs.  They're all failing with errors like this:
>> 
>> https://gist.github.com/myronmarston/ecc67c1a9f9c2ed89491
>> 
>> I had to install postgres for this (I haven't used it in years) and I 
>> haven't used rails in years so I'm pretty rusty with debugging issues with 
>> this.  I also don't have much time to invest in this.  Sorry :(.
>> 
>> Maybe someone else can volunteer to take a look at your project?
>> 
>> Myron
> Not a problem, Myron.
> For those who could take a look at the error, to set up the projet:
> - have Postgresql installed
> - clone the branch 
> https://github.com/Javix/jlc-invest/tree/rspec_features_back
> - run bundle install
> - rake db:create
> - rake db:migrate
> - [optional] populate a database: rake db:populate (see 
> lib/tasks/sample_data.rake for more details).
> - rake db:test:prepare
> - rspec
> 
> Thank you
> 
> Thanks, I followed these steps and was able to run your specs. Not sure what 
> I missed yesterday.  (Clearly it's been a long time since I worked on a rails 
> app....).
> 
> Anyhow, Aaron's definitely right: the problem is that you have records that 
> are being created in the DB outside of transaction and are "leaking" into 
> other examples.  Any records created in the DB are essentially "global" state 
> that has to be cleaned up between examples (or between example groups) and 
> you're responsible for doing that.  With the database cleaner transaction 
> strategy that you've hooked up for each example, it'll take care of that for 
> any records created within an individual example but can't work for records 
> created in the :all hooks.  I've created a PR that shows one solution for 
> solving the problem:
> 
> https://github.com/Javix/jlc-invest/pull/1
> 
> Myron

Thank you guys for your help, the links provided to learn more about DBCleaner, 
transaction, truncation rare reeeeeaaaally helpful (never had the need to dig 
it deeper :) ).
@Myron: I'll integrate the PR in the nearest time (rush time for the moment).

THANKS A LOTS !!!!
> 
> -- 
> You received this message because you are subscribed to a topic in the Google 
> Groups "rspec" group.
> To unsubscribe from this topic, visit 
> https://groups.google.com/d/topic/rspec/bwqHFUsldbg/unsubscribe.
> To unsubscribe from this group and all its topics, 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/407bfccb-64cf-4706-b510-7066aede38b9%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
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/ACBCBE8A-BA12-4CDA-A605-22CFFBD29DF6%40gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to