FactoryGirl/Rails: 替换从模块调用的现有方法?

FactoryGirl/Rails: replace existing method called from module?

我有几个 classes,其中包含一个模块 EventTracker,它又使用回调来记录事件。 EventTracker 在每个 class 中调用 my_config,其中 returns 一个散列,其中填充了要在事件跟踪过程中忽略的字段名称。

require 'event_tracker'

class User < ActiveRecord::Base

    EVENTS = Rails.application.config_for(:users)

    include EventTracker    

    def my_config
        EVENTS
    end

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

这是模块:

module EventTracker

    extend ActiveSupport::Concern

  included do
    after_save :record_event
    after_destroy :record_destroyed
  end

    def get_change_fields
        attribute_names - my_config['exclude']
    end

    private

        def record_event
            changed = {}
            puts "my config is #{my_config}"
            self::changes.each do |key, val|
                changed[key] = val if get_change_fields().include? key
            end
            Event.record_event self, changed
        end

        def record_destroyed
            Event.record_event self, nil, 'destroy'
        end

end

这在控制台和 运行 服务器上工作正常,但是当我尝试 运行 RSpec 测试时,必须创建一个用户登录,我创建用户时出现错误:方法 get_change_fields 在实例中调用 my_config 时失败。我想这是因为 class 没有加载和解析包含所需数据的 yaml 文件?

Failures:

  1) CasesController should have a current_user
     Failure/Error: Unable to find matching line from backtrace
     TypeError:
       no implicit conversion of nil into Array
     # ./app/models/event_tracker.rb:11:in `-'
     # ./app/models/event_tracker.rb:11:in `get_change_fields'
     # ./app/models/event_tracker.rb:20:in `block in record_event'
     # ./app/models/event_tracker.rb:19:in `each'

有没有办法让 FactoryGirl 在调用 my_config 时介入并提供哈希值?

您可以尝试类似的方法:

    let(:my_config) { exclude: 'exclude' }

    before do
      allow(subject).to receive_messages(my_config: my_config)
    end

您可以在 RSpec 测试中为您的当前用户存根 my_config,就像我在上面向您展示的那样。 如果可行,请告诉我。我可以看到你的输出更新答案。