2014-02-27 76 views
11

我有以下行spec_helper.rbRspec的:事務燈具不升級後工作軌道4

config.use_transactional_fixtures = true 

設置這意味着,每個試驗應清理後本身。任何由一次測試所做的db更新都不應該在下一次測試中出現。

我在我的一個spec文件中有兩個測試。

it 'should update the DB' do 
    Setting.put('abcd', 'efgh') 
end 

it 'should not find the DB update' do 
    Setting.get('abcd').should be_nil 
end 

上述兩個試驗中使用的使用Rails 3.2.14

工作升級後然而到導軌4,第二測試失敗,出現以下錯誤,

------ 
expected: nil 
got: "efgh" 
----- 

我有一個由於這個問題,100個測試失敗。

我可以找到的Rails 4升級的唯一相關文檔是相當模糊的: 「Rails 4.0已棄用ActiveRecord :: Fixtures以支持ActiveRecord :: FixtureSet。」

我不確定這是否相關。理想情況下,我希望有一個全局設置(config.use_transactional_fixtures = true),並且不必改變測試的邏輯(或者在(:each)/之前添加額外的(:each)模塊來獲得現有的測試通過請幫忙

+0

它看起來像'rspec的-rails'問題。嘗試升級到'rspec-rails 2.13.1'。看看這個問題 - > https://github.com/rails/rails/issues/10376 – usha

+2

@Vimsha,我試過2.13.1和2.14.1,但問題似乎持續存在。 :( – boboverflow

+0

相關?https://github.com/rails/rails/issues/10376 – zetetic

回答

1

對我來說,除去

require 'rspec/autorun' 

f rom spec_helper使事情正常工作。

我有宙斯服務器運行。症狀是如果我運行測試與宙斯服務器事務將被保存到測試數據庫。

當zeus服務器沒有運行時,rspec可以正常工作。

爲了使它與宙斯服務器工作,我不得不自動運行。

1

我在rails 4.1上的問題與rspec-rails 3.1完全相同。沒有自動運行,雖然我確實有春天,這可能是罪魁禍首。 不過,我決定嘗試另一種,這很好地工作:數據庫清理,它做了類似的工作: https://github.com/DatabaseCleaner/database_cleaner

因此增加的Gemfile:

group :test do 
... 
    gem 'database_cleaner' 
... 
end 

然後換軌幫手:

#Database cleaning 
    config.use_transactional_fixtures = false #IMPORTANT, make sure that rails doesn't try and clean it 
    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction #usually use transaction as the strategy - this is what transaction_fixtures does 
    DatabaseCleaner.clean_with(:truncation) # I like to ensure my database is in clean state to start with so I truncate at the start of the suite - this is optional. 
    end 

    config.around(:each) do |example| 
    DatabaseCleaner.cleaning do 
     example.run 
    end 
    end 
0

我不確定,這是同樣的問題。但對我來說,解決方案是 - 只在「it」do/end塊中創建數據。如果您在上下文中創建數據,則不起作用。

該作品:

context "with array of both exista and non exist words" do 

     clean_words = ["foo", "bar", "foobar"] 

     language = "eng" 
     it "return array of word, that exist in Word class" do 
     word = FactoryGirl.create(:word) 
     word2 = FactoryGirl.create(:word, name: "bar") 
     exist_words = [word, word2] 
     expect(Word.generate_list_of_exist_words(clean_words, language).sort).to eq exist_words.sort 

     end 
    end 

,這不是工作:

context "with array of both exista and non exist words" do 

     clean_words = ["foo", "bar", "foobar"] 
     word = FactoryGirl.create(:word) 
     word2 = FactoryGirl.create(:word, name: "bar") 
     exist_words = [word, word2] 
     language = "eng" 
     it "return array of word, that exist in Word class" do 

     expect(Word.generate_list_of_exist_words(clean_words, language).sort).to eq exist_words.sort 

     end 
    end