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
,就像我在上面向您展示的那样。
如果可行,请告诉我。我可以看到你的输出更新答案。
我有几个 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
,就像我在上面向您展示的那样。
如果可行,请告诉我。我可以看到你的输出更新答案。