我的服务工作完全手动测试,但我需要编写服务测试。所以我在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
答案 0 :(得分:2)
这是因为您使用let!
。这个帮助器只会在您第一次引用它时创建该对象,这在测试中从未进行过。在这种情况下,您应该使用before :each
或before :all
块(取决于您的规范在describe
块中执行的操作):
before :each do
@object1 = create :obj
@object2 = create :obj
@object3 = create :obj
@object4 = create :obj
end
如果您不需要对对象的引用,可以在循环中创建它们:
4.times { create :obj }