簡體   English   中英

你如何在 Rails 中使用 Rspec 測試你的配置/初始化腳本?

[英]How do you test your Config/Initializer Scripts with Rspec in Rails?

所以我在網上搜索解決方案,但似乎很少有關於測試在 Rails 中創建的初始化程序的信息。

目前,我已經在我的 config/initializers/retrieve_users.rb 文件中編寫了一個相當大的 API call-n-store。 它發出 API 請求,解析 JSON,然后將數據存儲為用戶。 相當可觀,我還沒有想出最干凈的方法來測試它。 由於我需要在運行任何函數之前檢索用戶,因此我不相信我可以將此腳本移至其他任何地方(盡管歡迎其他建議)。 我對此有幾個問題:

  1. 我是否必須將它包裝在一個函數/類中來測試我的代碼?
  2. 我會把我的規范文件放在哪里?
  3. 我將如何格式化它 RSpec 風格?

謝謝!

我只是試了一下,並通過了 rspec 測試,我將進一步重構我的代碼,最后它會更短,但這里是我所做的快照,使用此鏈接作為指南:

它的要點是:在你的初始化文件中用你想要的函數創建一個類,然后對類中的函數編寫測試。

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

看起來這很棘手,因為在加載環境時會調用初始化程序,這發生在示例運行之前。

我認為您已經找到了最重要的步驟:將代碼移到另一個單元中,在那里它可以在 Rails 初始化過程之外進行測試。 這可以是一個類或一個模塊。 使用webmock模擬網絡依賴

這段代碼應該放在哪里? 看到這個(現在很古老)的答案不亞於 Yehuda Katz 本人。 將spec文件放在樹的對應部分; 即如果單元在lib/my_class.rb ,則規范在spec/lib/my_class_spec.rb 您可能需要修改spec/rails_helper以加載規范文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM