У меня есть следующий код в одном из моих классов:Как я могу проверить memoization с RSpec?
class Settings < ActiveRecord::Base
def self.current
@settings ||= Settings.where({ environment: Rails.env }).first_or_create!
end
# Other methods
end
Basic поведения:
- Это создает новый рекорд по первому зову.
- Он возвращает тот же результат с последующими вызовами.
- Сбрасывает ivar после каждого обновления, возвращая первую (и уникальную) запись, связанную с текущей средой, в последующих вызовах.
Для этого метода у меня есть следующий тест:
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
Так что мой вопрос: как я могу проверить memoization на этот метод с 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