我遇到以下代碼的問題,它只在某些時候運行它。Activerecord創建方法有時不能及時工作
require_relative 'spec_helper'
require 'pry'
RSpec.describe Round do
testFruit = [Fruit.create(name: "Anjou Pear", unit: "10/LB", price: 13.24), Fruit.create(name: "Anjou Bear", unit: "10/LB", price: 15.24)]
before(:each) do |variable|
@round = Round.new
end
it 'returns all fruit in the current round of ordering' do
expect(@round.fruits).to match_array(testFruit)
end
it 'lets you clear the list for the next round' do
@round.next
expect(@round.fruits).to match_array([])
end
end
凡@round.fruits
被定義爲
def fruits
Fruits.all
end
所以我理解Fruits.all
必須等待testFruits要永久保存的資料庫,我猜這是不是在按時完成?有沒有一種方法可以用rspec異步測試,並且應該以不同的方式設計我的測試以避免此問題?
我得到的是 ``` 故障/錯誤的錯誤:預期(@ round.fruits)。爲了match_array(testFruit)
expected collection contained: [#<Fruit id: 53, pic: nil, description: nil, name: "Anjou Pear", unit: "10/LB", price: #<BigDecimal:2...l:206de28,'0.1524E2',18(27)>, created_at: "2016-09-27 18:18:23", updated_at: "2016-09-27 18:18:23">]
actual collection contained: []
```
將testFruit = [...]前面的內容(:each)作爲@testFruit = [...]並且它應該可以工作,您不會在示例之外或之前創建對象(:each)該數據將保留在數據庫 – arieljuod
因此,在運行規範之後,在before(:each)塊中創建的對象將被刪除/不會在數據庫中持久存在? –
是的,在before(:each)塊內創建的對象將不會持續用於下一個spec。如果你之前創建了一個以外的(:each)(例如之前(:all)),你必須在你的規範之後(使用after(:all)塊)刪除它,或者使用數據庫清理寶石(比如DatabaseCleaner)或者你最後會有一個測試數據庫,裏面裝滿了舊版本的垃圾。 – arieljuod