首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试/模拟与外部gem交互的Trailblazer操作?

如何测试/模拟与外部gem交互的Trailblazer操作?
EN

Stack Overflow用户
提问于 2016-02-26 08:03:57
回答 2查看 756关注 0票数 1

我喜欢Trailblazer所有面向对象的美!

我有一个与gem (称为cpanel_deployer)交互的操作,可以在web上做一些外部的事情。(它会向cpanel中添加一个附加域。)

代码语言:javascript
复制
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 gem已经测试过了,所以我不需要在这里重新测试它的功能。但是为了测试操作,我想确保使用正确的参数调用CpanelDeployer::Panel#add_domain。所以我想我应该嘲笑CpanelDeployer::Panel

我认为尝试使用any_instance_of是一种糟糕的做法。根据thoughtbot的说法,它通常被认为是代码气味...他们建议使用依赖注入。有没有在trailblazer操作中使用依赖注入的好方法?对于这种情况,有没有其他的最佳实践?

EN

回答 2

Stack Overflow用户

发布于 2016-02-26 08:03:57

一种选择是将:new存根到gem的类中,然后返回测试替身。这看起来是这样的:

代码语言:javascript
复制
  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
EN

Stack Overflow用户

发布于 2016-02-26 18:04:15

老实说,我真的不明白real_cpanel_add_domain在做什么,因为在我看来,它只是分配了两个局部变量,然后在其中一个变量上调用add_domain,这会有什么影响呢?

谈到依赖注入,我猜你可以从params获得域类和面板类,缺省为CpanelDeployer::DomainCpanelDeployer::Panel,但在规范中传递一些存根。

我不是存根new方法的狂热爱好者,因为它并不总是像预期的那样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35640873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档