【问题标题】:How to test initialize method of ruby which inturn calls the private method如何测试ruby的初始化方法,该方法又调用私有方法
【发布时间】:2020-05-12 09:38:15
【问题描述】:
# frozen_string_literal: true

require 'yaml'
require 'singleton'
require 'pry'

module Plugin
  module Rules
    class RulesLoader
      include Singleton

      attr_reader :definitions

      def initialize
        @definitions = load #it is calling the private method and loads the definitions
      end

      def fetch_rule_definition_for(key)
        definitions[key]
      end

      private
      def load
        #Other code
        Hash = {}
        #this method returns the hash after processing
      end
    end
  end
end

如何为这个类编写规范,其中初始化方法调用私有方法并加载实例变量。由于加载方法是私有的,我不直接调用。

【问题讨论】:

  • 如果您需要将load 包装到另一个方法中,为什么要使用构造函数呢?您可以简单地创建方法definitions,或使用别名。

标签: ruby rspec rspec-rails


【解决方案1】:

我建议用记忆重写一下。

module Plugin
  module Rules
    class RulesLoader
      include Singleton

      def fetch_rule_definition_for(key)
        @definitions ||= load_definitions
        @definitions[key]
      end

      private

      def load_definitions
        #Other code
        hash = {}
        #this method returns the hash after processing
      end
    end
  end
end

假设的规格:

describe Plugin::Rules::RulesLoader do
  context '#fetch_rule_definition_for' do
    subject(:fetch_rule_definition) { described_class.instance.fetch_rule_definition_for(key) }

    context 'with valid key' do
      let(:key) { :valid_key }

      it 'returns definitions' do
        expect(fetch_rule_definition).to eq(#YOUR_VALUE_HERE#)
      end
    end

    context 'with invalid key' do
      let(:key) { :invalid_key }

      it 'returns nil' do
        expect(fetch_rule_definition).to be_nil
      end
    end
  end
end

【讨论】:

  • @Mahant 酷。如果是,您能否将我的答案标记为正确的答案?
  • 您好,我希望对上述代码进行进一步改进。 def initialize @definitions = load(path) end 现在,initialize 方法正在调用带有路径的加载方法。 load 方法将检查该路径中的每个 yml 文件并将 yml 文件的内容添加到哈希中。现在我想测试私有的加载方法。所以我创建了一个fixtures 文件夹并在其中添加了所有的yml 文件。 subject(:fetch_rule_definition) { describe_class.instance.fetch_rule_definition_for(key) } 如何使用参数调用 describe_class.instance。参数为夹具路径
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2016-08-13
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多