我很喜欢Trailblazer的所有面向对象的美丽!如何测试/模拟与外部宝石交互的开拓者操作?
我有一个操作可以与一个gem(叫做cpanel_deployer
)交互,在网络上做一些外部事情。 (它增加了一个附加域到的cPanel。)
class Website::Deploy < Trailblazer::Operation
attr_reader :website, :cpanel
def process(params)
real_cpanel_add_domain
website.cpanel = cpanel
website.save
end
private
def setup!(params)
@cpanel = Cpanel.find(params[:cpanel_id])
@website = website.find(params[:website_id])
end
def real_cpanel_add_domain
cp_domain = CpanelDeployer::Domain.new(website.domain)
cp_panel = CpanelDeployer::Panel.new(cpanel.host, cpanel.username, cpanel.password)
res = cp_panel.add_domain(cp_domain)
raise StandardError unless res
end
end
的cpanel_deloyer
宝石已经测试过,所以我并不需要重新测试它的功能在这里。但为了测试操作,我想确保CpanelDeployer::Panel#add_domain
以正确的参数被调用。所以我想我应该嘲笑CpanelDeployer::Panel
。
我认为尝试使用any_instance_of
是不好的做法。根据thinkbot,它通常被认为是代码异味...他们推荐使用依赖注入。在开拓者操作中是否有使用依赖注入的好方法?对于这种情况还有另一种最佳做法吗?
'real_cpanel_add_domain'是与外界交互的东西。 'cpanel.add_domain()'调用是将网站添加到外部网站中的真实cPanel。有没有更好的方式来做这个外界的互动? 这是有趣的想法注入参数....但我不认为我想要在应用程序中实际使用它... – Josh