【问题标题】:Test service Rspec always return empty array测试服务 Rspec 总是返回空数组
【发布时间】:2016-01-15 00:57:58
【问题描述】:

我的服务可以完美地手动测试,但我需要编写服务测试。所以我在 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

【问题讨论】:

  • ReadService.read(2)?根据您的测试, ReadService 不是一个模块。只是一堂课。而且您正在传递一个固定编号。也许发布你对ReadService 的实现?

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


【解决方案1】:

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

【讨论】:

  • 我可以用更“优雅”的方式来做这件事吗?
  • 您需要引用各个对象吗?
  • 添加了一个循环来创建答案中的对象。如果您有多个测试,或者在单个测试的开头,您可以将其放入 before 循环中。
  • @Kam let! 总是在前块中创建对象 -- let(没有!)仅在第一次访问时才被延迟评估
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2020-09-03
相关资源
最近更新 更多