我喜欢Trailblazer所有面向对象的美!
我有一个与gem (称为cpanel_deployer)交互的操作,可以在web上做一些外部的事情。(它会向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
endcpanel_deloyer gem已经测试过了,所以我不需要在这里重新测试它的功能。但是为了测试操作,我想确保使用正确的参数调用CpanelDeployer::Panel#add_domain。所以我想我应该嘲笑CpanelDeployer::Panel。
我认为尝试使用any_instance_of是一种糟糕的做法。根据thoughtbot的说法,它通常被认为是代码气味...他们建议使用依赖注入。有没有在trailblazer操作中使用依赖注入的好方法?对于这种情况,有没有其他的最佳实践?
发布于 2016-02-26 08:03:57
一种选择是将:new存根到gem的类中,然后返回测试替身。这看起来是这样的:
describe Website::Deploy do
let(:cpanel) { Cpanel::Create.(cpanel: {
host: 'cpanel-domain.com', username: 'user', password: 'pass'
}).model }
let(:website) { Website::Create.(website: { domain: 'domain.com' }).model }
it 'works' do
fake_cp_domain = double(CpanelDeployer::Domain)
fake_cp = double(CpanelDeployer::Panel)
expect(fake_cp).to receive(:add_domain).with(fake_cp_domain).and_return(true)
expect(CpanelDeployer::Domain).to receive(:new)
.with(website.domain)
.and_return(fake_cp_domain)
expect(CpanelDeployer::Panel).to receive(:new)
.with(cpanel.host, cpanel.username, cpanel.password)
.and_return(fake_cp)
Website::Deploy.(cpanel_id: cpanel.id, website_id: website.id)
end
end这看起来很麻烦。有没有更好的方法?
发布于 2016-02-26 18:04:15
老实说,我真的不明白real_cpanel_add_domain在做什么,因为在我看来,它只是分配了两个局部变量,然后在其中一个变量上调用add_domain,这会有什么影响呢?
谈到依赖注入,我猜你可以从params获得域类和面板类,缺省为CpanelDeployer::Domain和CpanelDeployer::Panel,但在规范中传递一些存根。
我不是存根new方法的狂热爱好者,因为它并不总是像预期的那样工作。
https://stackoverflow.com/questions/35640873
复制相似问题