测试服务 Rspec 总是 return 空数组

Test service Rspec always return empty array

我的服务可以完美地手动测试,但我需要编写服务测试。所以我在 rspec

中创建服务测试
require 'rails_helper'

RSpec.describe ReadService do
  describe '#read' do
    context 'with 4 count' do
      let!(:object1) { create(:obj) }
      let!(:object2) { create(:obj) }
      let!(:object3) { create(:obj) }
      let!(:object4) { create(:obj) }

      it 'return 2 oldest obj' do
        expect(ReadService::read(2)).to eq [report4,report3]
      end
    end

但是ReadService::read(2)在测试中return[]

当我手动输入时

ReadService::read(2)

它 return 数组正确地包含两个最旧的对象。我做错了什么?我在测试中调用此服务不正确?

读取服务实现

class ReadService
  def self.read(count)
    objects = Object.get_oldest(count)

    objects.to_a
  end
end

发生这种情况是因为您使用了 let!。这个助手只会在您第一次引用它时创建对象,而您在测试中永远不会这样做。在这种情况下,您应该使用 before :eachbefore :all 块(取决于您的规范在 describe 块中的作用):

before :each do
  @object1 = create :obj
  @object2 = create :obj
  @object3 = create :obj
  @object4 = create :obj
end

如果您不需要对对象的引用,您可以在循环中创建它们:

4.times { create :obj }