For*_*low 6 rspec config ruby-on-rails initializer rspec-rails
所以我在网上搜索解决方案,但似乎有关于测试在Rails中创建的初始化程序的稀缺信息.
目前,我在config/initializers/retrieve_users.rb文件中编写了一个非常大的API call-n-store.它发出API请求,解析JSON,然后将数据存储为用户.由于非常实质,我还没有找到最简洁的测试方法.由于我需要在运行任何函数之前检索用户,我不相信我可以在其他地方移动此脚本(尽管欢迎其他建议).我有几个问题:
谢谢!
我只是试了一下,并通过了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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
看起来这很棘手,因为加载环境时会调用初始化程序,这发生在运行示例之前。
我认为您已经找到了最重要的步骤:将代码移动到另一个单元中,可以在 Rails 初始化过程之外对其进行测试。这可以是一个类或一个模块。使用webmock模拟网络依赖关系。
该代码应该驻留在哪里?请参阅耶胡达·卡茨 (Yehuda Katz) 本人的回答(现已相当古老)。将spec文件放入树的相应部分;即,如果单位最终为lib/my_class.rb,则规格为spec/lib/my_class_spec.rb。您可能需要修改spec/rails_helper才能加载规范文件。
| 归档时间: |
|
| 查看次数: |
6150 次 |
| 最近记录: |