如何在Rails中使用Rspec测试配置/初始化脚本?



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

目前,我已经在我的config/initializers/retrieve_users中写了一个相当大的API call-n-store。rb文件。它发出API请求,解析JSON,然后将数据存储为用户。由于它相当庞大,我还没有找到最干净的测试方法。因为我需要在运行任何函数之前检索用户,所以我认为我不能将此脚本移到其他地方(尽管欢迎其他建议)。我有几个问题:
  1. 我是否必须在一个函数/类中包装这个来测试我的代码?
  2. 我该把我的规格文件放在哪里?
  3. 我如何格式化它的rspec风格?

谢谢!

我只是给了这个机会,并通过了rspec测试,我将进一步重构我的代码,最后它会更短,但这里是我所做的一个快照,使用这个链接作为指导:

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

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

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

我想你已经弄清楚了最重要的一步:将代码移动到另一个单元,在那里它可以在Rails初始化过程之外进行测试。它可以是一个类或一个模块。使用webmock模拟网络依赖。

该代码应该驻留在哪里?看看耶胡达·卡茨(Yehuda Katz)自己的回答(现在相当古老)。将规范文件放在树的相应部分;即,如果单元最终在lib/my_class.rb,规格在spec/lib/my_class_spec.rb。您可能需要修改spec/rails_helper来加载规范文件。

最新更新