我在我的一個類下一個代碼:如何使用RSpec測試記憶?
class Settings < ActiveRecord::Base
def self.current
@settings ||= Settings.where({ environment: Rails.env }).first_or_create!
end
# Other methods
end
基本行爲:
- 它創建於第一次呼叫的新紀錄。
- 它隨後的調用返回相同的結果。
- 它在每次更新後重置伊娃,並在隨後的調用中返回與當前環境關聯的第一條(和唯一)記錄。
對於這種方法我也試了下:
describe Settings do
describe ".current" do
it "gets all settings for current environment" do
expect(Settings.current).to eq(Settings.where({ environment: 'test' }).first)
end
end
end
我不覺得舒服,由於我其實不是測試記憶化,所以我一直對this question的方法如下,並我已經試過這樣的事情:
describe ".current" do
it "gets all settings for current environment" do
expect(Settings).to receive(:where).with({ environment: 'test' }).once
2.times { Settings.current }
end
end
但這種測試返回以下錯誤:
NoMethodError:
undefined method `first_or_create!' for nil:NilClass
所以我的問題是,我怎樣才能用RSpec測試這種方法的記憶?
UPDATE:
最後,我的做法如下:
describe Settings do
describe ".current" do
it "gets all settings for current environment" do
expect(described_class.current).to eq(described_class.where(environment: 'test').first)
end
it "memoizes the settings for current environment in subsequent calls" do
expect(described_class).to receive(:where).once.with(environment: 'test').and_call_original
2.times { described_class.current }
end
end
end
無需測試記憶 – NARKOZ
爲什麼我不應該測試記憶? – backpackerhh