ruby-on-rails - Ruby on Rails 应用程序中的 Rspec 应该测试什么测试

标签 ruby-on-rails ruby testing rspec tdd

我是 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? == 真

 context 'with empty tenant' do
   it { expect(ConnectorJob.new.perform(@tenant.id)).to change(User.count).by(0) }
 end

如果 service.success? == 错误

context 'MyAPP::ContactToSync return false' do
   it { expect(ConnectorJob.new.perform(@tenant.id)).to change(User.count).by(0) }
 end

如果 service.success? == 真

context 'success' do
   it { expect(ConnectorJob.new.perform(@tenant.id)).to change(User.count).by(1) }
 end

应该足以覆盖所有场景。

关于ruby-on-rails - Ruby on Rails 应用程序中的 Rspec 应该测试什么测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50876558/

相关文章:

javascript - 如何为我的代码编写测试用例

ruby-on-rails - Ruby on Rails:url_for:back导致back_url出现NoMethodError

javascript - Ruby on Rails - gmaps4rails - 传递标记数据。超出最大调用堆栈大小

ruby - rspec : syntax error, unexpected keyword_end, expecting end-of-input (SyntaxError)

html - 自动完成以及如何让它理解小写和大写

java - 如何断言已将适当的值分配给私有(private)字段?

html - 使用 JUnit/Selenium 查找 HTML 表格单元格

ruby-on-rails - 将属性附加到模型以在 Rails 3 上临时使用

ruby-on-rails - 在整个 Rails 应用程序中执行 SSL 的最佳和最简单的设置是什么?

ruby-on-rails - 合并参数 rails