【问题标题】:How do you test your Config/Initializer Scripts with Rspec in Rails?如何在 Rails 中使用 Rspec 测试 Config/Initializer 脚本?
【发布时间】:2014-09-28 14:41:51
【问题描述】:

所以我在网上搜索解决方案,但似乎很少有关于测试在 Rails 中创建的初始化程序的信息。

目前,我在 config/initializers/retrieve_users.rb 文件中编写了一个相当大的 API call-n-store。它发出 API 请求,解析 JSON,然后将数据存储为用户。相当充实,我还没有找到最干净的方法来测试它。由于我需要在运行任何函数之前检索用户,我不相信我可以将此脚本移动到其他任何地方(尽管欢迎其他建议)。我对此有几个问题:

  1. 是否必须将其包装在函数/类中才能测试我的代码?
  2. 我应该把我的规范文件放在哪里?
  3. 如何将其格式化为 RSpec 样式?

谢谢!

【问题讨论】:

  • 这听起来是个坏习惯。例如,如果服务关闭,您的应用程序将拒绝启动,直到它可以连接或超时,然后它会引发异常,很可能会使您的应用程序崩溃。我会重新考虑您在哪里执行此操作或您要完成什么

标签: ruby-on-rails rspec config rspec-rails initializer


【解决方案1】:

我只是试了一下,并通过了 rspec 测试,我将进一步重构我的代码,最后它会更短,但这里是我所做的快照,使用 this link as a guide:

它的要点是:在你的初始化文件中用你想要的函数创建一个类,然后对类中的函数编写测试。

config/initializers/stripe_event.rb

StripeEvent.configure do |events|
  events.subscribe 'charge.dispute.created' do |event|
    StripeEventsResponder.charge_dispute_created(event)
  end
end

class StripeEventsResponder
  def self.charge_dispute_created(event)
    StripeMailer.admin_dispute_created(event.data.object).deliver
  end
end

spec/config/initializers/stripe_events_spec.rb

require 'spec_helper'

describe StripeEventsResponder do
  before { StripeMock.start }
  after { StripeMock.stop }
  after { ActionMailer::Base.deliveries.clear }

  describe '#charge_dispute_created' do
    it "sends one email" do
      event = StripeMock.mock_webhook_event('charge.dispute.created')
      StripeEventsResponder.charge_dispute_created(event)
      expect(ActionMailer::Base.deliveries.count).to eq(1)
    end

    it "sends the email to the admin" do
      event = StripeMock.mock_webhook_event('charge.dispute.created')
      StripeEventsResponder.charge_dispute_created(event)
      expect(ActionMailer::Base.deliveries.last.to).to eq(["admin@example.com"])
    end
  end
end

【讨论】:

    【解决方案2】:

    这似乎很棘手,因为初始化程序是在加载环境时调用的,这发生在示例运行之前。

    我认为您已经找到了最重要的一步:将代码移到另一个单元中,以便在 Rails 初始化过程之外对其进行测试。这可以是一个类或一个模块。使用 webmock 模拟网络依赖项。

    这段代码应该放在哪里?看到这个(现在很古老)answer,不亚于 Yehuda Katz 本人。将spec文件放在树的对应部分;即,如果该单元以lib/my_class.rb 结尾,则规范为spec/lib/my_class_spec.rb。您可能需要修改spec/rails_helper 以加载规范文件。

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多