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

时间:2014-08-05 19:57:28

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

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

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

  1. 我是否必须将它包装在函数/类中以测试我的代码?
  2. 我将把我的spec文件放在哪里?
  3. 我如何格式化RSpec风格?
  4. 谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

配置/初始化/ 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

规格/配置/初始化/ 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

答案 1 :(得分:1)

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

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

此代码应驻留在何处?看到这个(现在相当古老)answer不亚于耶胡达卡茨本人。将spec文件放在树的相应部分;即如果单位在lib/my_class.rb结束,则规范进入spec/lib/my_class_spec.rb。您可能需要修改spec/rails_helper以加载规范文件。