测试服务Rspec始终返回空数组

时间:2016-01-15 00:57:58

标签: ruby-on-rails ruby ruby-on-rails-4 rspec rspec-rails

我的服务工作完全手动测试,但我需要编写服务测试。所以我在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)在测试中返回[]

我手动输入时

ReadService::read(2)

它正确返回带有两个最老的obj的数组。我错了什么?我在测试中称这项服务不正确吗?

ReadService实现

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

    objects.to_a
  end
end

1 个答案:

答案 0 :(得分:2)

这是因为您使用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 }