【问题标题】:stubbing a class method inside a method in rspec to return true在 rspec 的方法中存根类方法以返回 true
【发布时间】:2020-11-01 04:42:12
【问题描述】:

这是我正在为其编写 rspecs 的类。

# frozen_string_literal: true. Thiis is the method **SiteLicenseService.get_package_for_site_license site_license_id, package_id**

module SiteLicenseGrants
  # Raise an error if no site license is found for a given package
  class Package
    # Fail if the given packages are not found or if they are not associated
    # with the site license
    def self.valid_package?(opts)
      package_id = opts[:package_id]
      site_license_id = opts[:site_license_id]
      return true if SiteLicenseService.get_package_for_site_license site_license_id, package_id
    rescue Errors::EntityNotFound
      raise Errors::NoSiteLicenseForPackage.new package_id # rubocop:disable Style/RaiseArgs
    end
  end
end

我想存根类方法以返回 true。

require "rails_helper"

RSpec.describe SiteLicenseGrants::Package do
  describe "check valid package" do

    context "valid package" do
      let(:package_id) { 1 }
      let(:site_license_id) { 1 }
      let(:opts) { { package_id: package_id, site_license_id: site_license_id } }
      before do
        site_license_service = class_double("SiteLicenseService")
        allow(site_license_service).to receive(:get_package_for_site_license).with(site_license_id, package_id).and_return(true)
      end

      it "returns true" do
        expect do
          described_class.valid_package?(opts)
        end.to be_truthy
      end
    end

    context "invalid package" do
      let(:opts) { { package_id: nil, site_license_id: nil } }
      it "throws error" do
        expect do
          described_class.valid_package?(opts)
        end.to raise_error(Errors::NoSiteLicenseForPackage)
      end
    end
  end
end

这是我遇到的错误

Failures:

  1) SiteLicenseGrants::Package check valid package valid package returns true
     Failure/Error: raise Errors::NoSiteLicenseForPackage.new package_id # rubocop:disable Style/RaiseArgs
     
     Errors::NoSiteLicenseForPackage:
       Package 1 doesn't have a site license associated with it

我只想模拟我的类方法以返回 true。我不想测试 SiteLicenseService 的类方法。我不想从字面上创建带有包的站点许可证。

谁能解释一下我做错了什么。

谢谢

【问题讨论】:

    标签: ruby rspec ruby-on-rails-5 rspec-rails rspec3


    【解决方案1】:

    确保模拟返回值的语法正确:

     allow(SiteLicenseService).to 
     receive(:get_package_for_site_license).and_return(true)
    

    在 Ruby 中,类是用 TitleCase 编写的,方法是用 snake_case 编写的。要接收的方法应该是一个:symbol。

    【讨论】:

    • 我编辑了我的问题,但我不再看到 arg 错误。谢谢
    【解决方案2】:

    我像这样改变了存根,它开始工作了

     before do
            allow(SiteLicenseService).to receive(:get_package_for_site_license).and_return(true)
          end
    

    现在它不寻找关系。但如果有人告诉我内部发生了什么变化,我将不胜感激。

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 2014-09-23
      • 2013-01-31
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2016-11-04
      • 2015-08-31
      • 2016-05-07
      相关资源
      最近更新 更多