2016-02-26 10 views
1

Я люблю всю объектно-ориентированную красоту Trailblazer!Как тестировать/изнашивать операции Trailblazer, которые взаимодействуют с внешними драгоценными камнями?

У меня есть операция, которая взаимодействует с драгоценным камнем (так называемый 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. По мыслим, это обычно считается запахом кода ... Они рекомендуют использовать инъекцию зависимостей. Есть ли хороший способ использования инъекции зависимостей в операции трейлера? Есть ли другая передовая практика для такого рода ситуаций?

ответ

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::Domain и CpanelDeployer::Panel, но проходя некоторые окурки в своих спецификациях.

Я не большой поклонник stubbing new, потому что он не всегда работает так, как ожидалось.

+0

'real_cpanel_add_domain' - это то, что взаимодействует с внешним миром. Этот вызов 'cpanel.add_domain()' - это то, что добавляет веб-сайт в реальный cpanel на внешний веб-сайт. Есть ли лучший способ сделать это во внешнем мире? Это интересная идея для инъекций с параметрами .... Но я не думаю, что хочу использовать его так в приложении ... – Josh

 Смежные вопросы

  • Нет связанных вопросов^_^