【发布时间】:2015-07-06 15:04:45
【问题描述】:
我有一个 Rails 引擎,其中包含链接到某些宿主应用程序类的方法(我知道这种类型的耦合很糟糕,但在这种情况下它是不可避免的)。
我需要测试使用主机类的方法,但在尝试对主机类进行加倍/模拟/存根时出现uninitialized constant MyEngine::BaseUser 错误(在本例中为BaseUser 或Tutor)。
我曾尝试通过创建模拟类来解决这个问题,但我认为我留下的是一个坏主意,这意味着我的测试不太有用(见下文)。
知道我可以做得更好,或者对更好的方向提出建议吗?
正如我上面所说,我(糟糕地)这样解决了这个问题:
BaseUser = Class.new do
attr_accessor :id
def initialize(id = 1)
@id = id
end
def self.find(id)
self.new(id)
end
def tutor
Tutor.find(self.id)
end
end
class Tutor
attr_accessor :id, :first_name
def initialize(id = 1)
@id = id
@first_name = "Tutor with ID #{id}'s first name"
end
def self.find(id)
self.new(id)
end
end
it 'returns the hosts first name' do
allow(MyEngine).to receive_message_chain(:user_class, :constantize) { BaseUser }
ai = FactoryGirl.create(:availability_interval, host_id: 1)
expect(ai.host_first_name).to eq BaseUser.find(1).tutor.first_name
end
我正在测试的方法是这样的:
def host_full_name
MyEngine.user_class.constantize.find(self.host_id).tutor.full_name
end
(MyEngine.user_class 是“基本用户”)
【问题讨论】:
标签: ruby-on-rails testing rspec rails-engines