2010-03-30 125 views
2

我一直在試圖解決問題幾個星期了。我爲我的Rails應用程序運行rspec測試,並且除了一個我似乎無法理解的錯誤外,它們工作正常。Rails測試數據庫不會持續記錄更改

  • 我正在使用MySQL和InnoDB引擎。
  • 我在spec_helper.rb中設置了config.use_transactional_fixtures = true
  • 我使用命令rake spec:db:fixtures:load手動加載我的測試夾具。
  • rspec測試正在爲BackgrounDRb worker編寫,它正在測試記錄可以更新其狀態(通過state_machine gem)。

這裏是我的問題:

我有一個名爲Listings模型。 rspec測試在名爲listing_worker.rb的文件中調用update_sold_items方法。 此方法爲特定記錄調用listing.sell,該記錄將列表記錄的「狀態」列設置爲「已售出」。 到目前爲止,這是所有工作的罰款,但是當update_sold_items方法完成,我的RSpec的測試失敗在這裏:

listing = Listing.find_by_listing_id(listing_id) 
listing.state.should == "sold" 

expected: "sold", 
    got: "current" (using ==) 

我一直在試圖追查爲什麼狀態變化不是持久的,但我非常丟失。下面是我在測試過程中放置​​在update_sold_items方法的一些調試代碼的結果:

pp listing.state # => "current" 

listing.sell! 
listing.save! 

pp listing.state # => "sold" 

listing.reload 

pp listing.state # => "current" 

我不明白爲什麼它保存完美的罰款,但隨後恢復到每當我打電話reload原始記錄,或Listing.find等等。

感謝您閱讀本文,如果我沒有提供足夠的信息,請提出任何問題。

感謝您的幫助, 彌敦道乙

附:我沒有爲其他類創建新記錄並測試這些記錄的問題。當我更新數據庫中已有的記錄時,它似乎只是一個問題。

+0

當你重新加載時,不要事務性的燈具會導致ROLLBACK?一切都在交易中,所以他們可以在每次測試之前重置。重新加載/ ROLLBACK將是原始狀態,而不是保存狀態,是嗎?你爲什麼重新加載它? – wesgarrison 2010-03-30 01:18:42

+0

好點。我並不是100%確定交易是如何運作的。謝謝你的幫助! – ndbroadbent 2010-03-31 00:23:49

回答

1

我懷疑像nathan一樣的交易問題。嘗試在第一次保存調用之前放置一個Listing.connection.execute(「COMMIT」)來中斷事務並查看哪些更改。這會使你退出事務處理,所以任何額外的回滾調用都將不起作用。

此外,通過運行「COMMIT」命令,您可以使用調試器暫停測試並檢查來自其他客戶端的數據庫以查看發生了什麼。另一個假設,如果事務實驗沒有產生任何結果,那麼可能是你的模型實際上並沒有保存到數據庫中。檢查你的查詢日誌。 (具體找到更新查詢)。

這類問題真的很臭!祝你好運!

+0

感謝您指點我正確的方向!我終於搞清楚了,我重寫了模型的「更新」方法,感覺像個白癡。謝謝!! – ndbroadbent 2010-03-31 00:22:19

0

如果你想調查什麼你在DB同時運行測試,你會發現這是很有幫助的......

我有一個RSpec的測試,讓我救@user。保存,它的作用就像一個魅力,但我想看看它是否真的保存在數據庫中。

我打開軌控制檯測試環境

rails c test 

User.all 

與預期沒有什麼

我跑我的規格,包含:

user_attr_hash = FactoryGirl.attributes_for(:user) 
@user = User.new user_attr_hash 
@user.save 
binding.pry 

我Ť希望在保存之後停止測試意味着它會一直存在,但事實並非如此。看來,在連接上提交前被觸發(我不知道什麼時候:\) 所以,@Tim哈珀暗示,你不得不解僱犯下自己在撬控制檯:現在

pry(#<RSpec::Core::ExampleGroup::Nested_1>)> User.connection.execute("COMMIT") 

,如果你在你的軌道控制檯中運行User.all你應該看到它;)