什么测试应该在Ruby on Rails应用程序中使用Rspec进行测试

时间:2018-06-15 13:26:20

标签: 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%覆盖了我的方法,但我不确定这是否正确。

我希望我很清楚,随时向我提出更多细节。

谢谢大家

1 个答案:

答案 0 :(得分:1)

我认为你应该测试最终结果,我的意思是调用后的结果 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

应该足以涵盖所有情景。