class Settings < ActiveRecord::Base def self.current @settings ||= Settings.where({ environment: Rails.env }).first_or_create! end # Other methodsend
基本行为:
>它在第一次通话时创建新记录.
>它随后的调用返回相同的结果.
>它在每次更新后重置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 endend
我对此感到不舒服,因为我实际上并没有测试memoization,所以我一直在关注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 } endend
但是此测试返回以下错误:
NoMethodError: undefined method `first_or_create!' for nil:NilClass
所以我的问题是,如何使用RSpec测试此方法的memoization?
更新:
最后,我的方法如下:
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 endend解决方法 在您的邮件期望中添加.and_call_original:
expect(Settings).to receive(:where).with({ environment: 'test' }).once.and_call_original总结
以上是内存溢出为你收集整理的ruby-on-rails – 如何使用RSpec测试memoization?全部内容,希望文章能够帮你解决ruby-on-rails – 如何使用RSpec测试memoization?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)