gpt4 book ai didi

ruby-on-rails - 如何使用 RSpec 测试内存?

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:04 28 4
gpt4 key购买 nike

我的一个类(class)中有下一个代码:

class Settings < ActiveRecord::Base
def self.current
@settings ||= Settings.where({ environment: Rails.env }).first_or_create!
end
# Other methods
end

基本行为:

  1. 它在第一次调用时创建了一个新记录。
  2. 它在后续调用中返回相同的结果。
  3. 它会在每次更新后重置 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

所以我的问题是,如何使用 RSpec 测试此方法的内存?

更新:

最后,我的做法是:

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

最佳答案

.and_call_original 添加到您的消息期望中:

expect(Settings).to receive(:where).with({ environment: 'test' }).once.and_call_original

关于ruby-on-rails - 如何使用 RSpec 测试内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665373/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com