ruby-on-rails – 如何使用RSpec测试memoization?

ruby-on-rails – 如何使用RSpec测试memoization?,第1张

概述我的其中一个课程中有下一个代码: class Settings < ActiveRecord::Base def self.current @settings ||= Settings.where({ environment: Rails.env }).first_or_create! end # Other methodsend 基本行为: >它在第一次通话时创建新记录. 我的其中一个课程中有下一个代码:

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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1284263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存