如何在Rails中用Rspec测试你的ConfigInitializer Scripts?

问题描述 投票:7回答:2

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

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

  1. 我必须用函数类来测试我的代码吗?
  2. 我应该把我的规范文件放在哪里?
  3. 我如何以RSpec风格来格式化它?

谢谢

ruby-on-rails rspec config rspec-rails initializer
2个回答
5
投票

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

它的要点是:在你的初始化器文件中建立一个类,里面有你想要的函数,然后在类中的函数上写测试。

在初始化器文件中加入你想要的功能,然后在类中的功能上写测试。

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

specconfiginitializersstripe_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(["[email protected]"])
    end
  end
end

1
投票

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

我想你已经知道了最重要的一步:将代码移到另一个单元中,在Rails初始化过程之外对其进行测试。这可以是一个类或一个模块。使用以下方法模拟网络依赖关系 网络模拟.

这段代码应该放在哪里?请看这个(现在已经很古老了)。回答 由不亚于Yehuda Katz本人的。把规范文件放在树的相应部分;即如果该单元最终在 lib/my_class.rb,规格是这样的 spec/lib/my_class_spec.rb. 您可能需要修改 spec/rails_helper 来加载规格文件。

© www.soinside.com 2019 - 2024. All rights reserved.