2012-12-31 146 views
2

我生成用戶,客戶和發票從下面的工廠設計測試數據庫中記錄上同時測試

FactoryGirl.define do 
    factory :user do 
    sequence(:email) { |n| "person_#{n}@example.com" } 
    password "foobar" 
    password_confirmation "foobar" 
    end 

    factory :client do 
    sequence(:name) { |n| "Client Name #{n}" } 
    sequence(:address1) { |n| "#{n} Street name" } 
    sequence(:address2) { |n| "#{n} Area name" } 
    city "Chennai" 
    state "Tamil Nadu" 
    country "India" 
    zipcode "600001" 
    contactname "Sathish Manohar" 
    sequence(:email) { |n| "person_#{n}@example.com"} 
    user 
    end 

    factory :invoice do 
    client 
    end 
end 

我有一些要求和型號規格,以下是主要的要求規範衝突,我有:

https://gist.github.com/4418869 - clients_pages_spec.rb
https://gist.github.com/4418876 - invoices_pages_spec.rb

當所有usersafter(:all) { User.delete_all }通話將被刪除,所有測試在按順序運行時都會通過bundle exec rspec spec --order default

如果在after(:all) { User.delete_all }中沒有刪除所有users,則運行測試時會顯示電子郵件唯一性錯誤。這是設計驗證每個用戶電子郵件唯一性的錯誤,所以我認爲當第二次運行測試時,factory_girl會嘗試創建相同的用戶。

這是錯誤消息:
/home/sathish/.rvm/gems/[email protected]_jet/gems/activerecord-3.2.8/lib/active_record/validations.rb:56:in `save!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)

如何擺脫這種錯誤信息,並創造設計的測試用戶的正確方法?

背景資料:
spec_helper.rbconfig.use_transactional_fixtures = true
使用MySQL作爲數據庫中的所有表都使用InnoDB引擎

回答

3

我認爲你應定義爲完全每個天賦後清理您的數據庫默認的策略,通過這樣做,保證每個測試的隔離。

看看https://github.com/bmabey/database_cleaner上的Database Cleaner gem。

所有您需要做的就是把寶石在你的Gemfile,運行bundle(假設你正在使用的捆綁),並定義的策略,因爲這樣的:

RSpec.configure do |config| 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

end 

希望它能幫助!

+0

我同意,測試絕對應該是孤立的,但根據我的經驗,最好在每次測試之前清理數據庫,而不是之後。這樣,當某些事情失敗時,您可以查看數據庫,然後查看有問題的數據。 –

+1

由於數據庫只是您數據的存儲機制,我並不完全同意您的陳述......您的對象模型是您的應用程序,您的數據庫只是爲您提供了一種通過持續保持這些對象狀態的方法。無論如何,希望DB Cleaner Gem幫助你解決你所描述的問題 –

+0

我不是那個問這個問題的人。我同意數據庫只是數據的存儲,但是代碼中的數據庫層也可能是錯誤的來源,並且查看實際存儲的數據可能很有用。因此我認爲在每次測試之前清理數據庫是一種實踐,而不是事後。與每次測試後的清潔相比,您看到什麼缺點? –