ruby-on-rails - 在 Ruby on Rails 应用程序中应该使用 Rspec 测试什么
问题描述
我是 Rspec 的初学者,实际上我们要求我对一些已经构建但从未测试过的方法进行 Rspec 测试(他们在构建方法之前不编写测试)。
现在我很想知道如何测试我的方法,这里是示例:
class ConnectorJob < ActiveJob::Base
queue_as :connector
def perform(tenant_id = nil, debug = false)
tenant_to_sync = Tenant.to_sync(tenant_id)
return if tenant_to_sync.empty?
tenant_to_sync.each do |tenant|
service = MyAPP::ContactToSync.new(tenant, debug).call
if service.success?
ConnectorService::Synchronization.new(
tenant, service.data, debug
).call
end
end
end
end
我应该对此进行什么测试?我应该测试返回值是否正确,或者是否可以很好地调用其他方法?
这是我试图做的
require "rails_helper"
RSpec.describe ConnectorJob, type: :job do
it 'is in connector queue' do
expect(ConnectorJob.new.queue_name).to eq('connector')
end
describe 'perform' do
let (:tenant) { create(:tenant) }
let (:job) { ConnectorJob.new.perform(tenant.id) }
context 'with empty tenant' do
it { expect(ConnectorJob.new.perform(@tenant.id)).to eq nil }
end
context 'with tenant' do
it { expect(ConnectorJob.new.perform(tenant.id)).to eq job }
end
end
end
正如你所看到的,我的最后一个测试没有意义,但我不知道我应该在我的 Rspec 上写什么来预测这种方法的结果。
如果我检查我的 Rspec 覆盖率,Rspec 告诉我我覆盖了 100% 的方法,但我不确定这是正确的。
我希望我很清楚,请随时问我更多细节。
谢谢你们
解决方案
我认为你应该测试最终结果,我的意思是调用
ConnectorService::Synchronization.new(...).call
和测试三个案例后的结果,例如如果这个调用创建新用户,你应该测试它:
如果tenant_to_sync.empty? == true
context 'with empty tenant' do
it { expect(ConnectorJob.new.perform(@tenant.id)).to change(User.count).by(0) }
end
如果service.success? == false
context 'MyAPP::ContactToSync return false' do
it { expect(ConnectorJob.new.perform(@tenant.id)).to change(User.count).by(0) }
end
如果service.success? == true
context 'success' do
it { expect(ConnectorJob.new.perform(@tenant.id)).to change(User.count).by(1) }
end
应该足以涵盖所有场景。
推荐阅读
- nginx - 如何仅将主页/index.php重定向到/而不申请Nginx中的其他页面?
- angular - 无法根据组件中的布尔值隐藏列标题
- android - 为什么查询 Purchases.subscriptions 资源时 developerPayload 字段为空?
- java - xstream 没有解析根元素
- flutter - Flutter 等效的 Android-Toggle-Switch
- java - Kafka生产者和消费者问题
- c++ - 如何在每个共享库中使用自己的静态库副本
- android - 使用终端命令构建 Android Apk 时出错
- python - 在神经网络中,如果输入 > 1 或 < -1,那么是否应该在传播之前应用激活函数?
- php - $request->all() 始终为空