【问题标题】:RSpec: Best way to mock chained DB queryRSpec:模拟链式数据库查询的最佳方式
【发布时间】:2016-11-21 14:02:33
【问题描述】:

我有以下疑问:

Trainee.select(:name, :employee_start_date, :exit_date, "count(reviewers.code_review_id) AS reviews_completed")
            .where(user_id: user_ids)
            .joins(:reviewers)
            .where(reviewers: { completion_time: start_date..end_date })
            .group('trainees.user_id').order('reviews_completed DESC')

我是 rails 和 rspec 的新手,在我的 rspec 测试中删除这个查询时遇到了很多麻烦。这是我目前所拥有的:

describe '#completed_code_reviews' do
  let(:trainee_service_client) { LeaderboardsService.new('trainee') }
  let(:start_date) { Date.new(2016, 1, 18) - 1.day }
  let(:end_date) { Date.new(2015, 8, 18) + 2.day }
  let(:order) { 'DESC' }

  let(:person_completed_reviews) { 4 }
  let(:select_result) { double('select') }
  let(:where1_result) { double('where1') }
  let(:joins_result) { double('joins') }
  let(:where2_result) { double('where2') }
  let(:group_result) { double('group') }
  let(:trainees_list) { [] }

  context 'a user has no connections' do
    user_ids = []

    it "returns an empty result" do
        allow(Trainee).to receive(:select)
                .with(:name, :devcenter_start_date, :exit_date, 
                    "count(reviewers.code_review_id) AS reviews_completed"
                ).and_return(select_result)

        allow(select_result).to receive(:where).with(user_id: user_ids).and_return(where1_result)

        allow(where1_result).to receive(:joins).with(:reviewers).and_return(joins_result)

        allow(joins_result).to receive(:where)
                .with(reviewers: { completion_time: start_date..end_date.end_of_day })
                .and_return(where2_result)

        allow(where2_result).to receive(:group).with("trainees.user_id").and_return(group_result)

        allow(group_result).to receive(:order).with(person_completed_reviews: order).and_return(trainees_list)


        expect(trainee_service_client.completed_code_reviews(start_date, end_date)).to eq([])
    end
  end
end

两件事:

1) 这实际上不起作用。我得到: Failure/Error: expect(trainee_service_client.completed_code_reviews(start_date, end_date, [])).to eq(trainee) Double "group" received :order with unexpected arguments expected: ({:person_completed_reviews=>"DESC"}) got: ("reviews_completed DESC")

如何正确模拟:order 方法?

2) 这个设置看起来也很混乱。有没有更简洁的方法?

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    1) 您可以通过以下方式修复错误:

    allow(group_result).to receive(:order).with("reviews_completed DESC").and_return(trainees_list)
    

    2) 这种嘲弄对我来说毫无意义。你从哪里得到这样做的想法?相反,我会创建您需要的记录。

    【讨论】:

    • 这确实修复了错误。我这样设置是因为有人给我看了一个类似的例子。这样,您可以单独模拟查询的每个步骤,并准确知道哪个点导致错误。至少我的初学者是这么理解的。
    • 我不知道你为什么要模拟查询的每一步。
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多