1

Trailblazer のオブジェクト指向のすべての美しさが大好きです。

ジェム ( と呼ばれる) と対話して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

end

gem は既にテスト済みなので、cpanel_deloyerここで機能を再テストする必要はありません。CpanelDeployer::Panel#add_domainしかし、操作をテストするために、正しい引数で呼び出されることを確認したいと思います。だから私は嘲笑すべきだと思っていCpanelDeployer::Panelます。

を使用しようとするのは悪い習慣だと思いますany_instance_of。思考ボットによると、通常はコードの匂いと考えられています...彼らは依存性注入の使用を推奨しています。Trailblazer 操作内で依存性注入を使用する良い方法はありますか? この種の状況に対する別のベスト プラクティスはありますか?

4

2 に答える 2

0

1 つのオプションは、gem のクラスをスタブ:newして、テスト double を返すことです。これは次のようになります。

  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-26T00:03:56.533 に答える