2016-02-26 47 views
1

我很喜歡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,它通常被認爲是代碼異味...他們推薦使用依賴注入。在開拓者操作中是否有使用依賴注入的好方法?對於這種情況還有另一種最佳做法嗎?

回答

0

一種方法是在寶石的類上存根:new並返回測試雙打。這是看起來像什麼:

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 

這似乎很麻煩...有沒有更好的方法?

0

老實說,我真的不明白real_cpanel_add_domain在做什麼,因爲在我看來,它只是分配了兩個局部變量,然後在其中一個上調用add_domain,這將如何影響任何東西?我想你可以從params獲得域和麪板類,默認爲CpanelDeployer::DomainCpanelDeployer::Panel,但在規範中傳遞一些存根。

我不是一個很迷戀new方法的人,因爲它並不總是像預期的那樣工作。

+0

'real_cpanel_add_domain'是與外界交互的東西。 'cpanel.add_domain()'調用是將網站添加到外部網站中的真實cPanel。有沒有更好的方式來做這個外界的互動? 這是有趣的想法注入參數....但我不認爲我想要在應用程序中實際使用它... – Josh