使用Rspec制作昂贵的方法

问题描述 投票:0回答:1

在下面的例子中,我只想将哈希传递给stubbed测试double。我不想测试双重本身。但我需要在我的测试中模仿它。实际的方法看起来像这样:

# user.rb
def do_work
  assignments = fetch_assignments
  if assignments.any?
    assignments.each do |assignment|
      if assignment.valid?
        client.approve_assignment({assignment_id: assignment.assignment_id})
      else
        client.reject_assignment({assignment_id: assignment.assignment_id})
      end
    end 

    mark_assignments_as_complete    
  end
end

现在我可以轻松测试所有功能,除了客户端。客户端是一个真正昂贵的(每个查询的成本钱)API查询,我不想每次运行测试时运行。所以我使用测试双打和存根:

describe "#do_work" do
  context "when two assignments are valid" do
    before :context do
      @user = User.create!({name: "Bob"})
      [{assignment_id: "1", valid: false}, {assignment_id: 2, valid: false}, {assignment_id: "3", valid: true}].each do |assignment|
        @user.assignments.create!(assignment)
      end
      @client = ExpensiveAPI.new
      @user.client = @client
    end
  end

  describe "#do_work" do
    it "accepts valid assignments" do
      user.valid_assignments.each do |assignment|
        allow(@client).to receive(:accept_assignment, {assignment_id: assignment.assignment_id}).and_return(true)
      end

      expect(@user.do_work).to have 2_completed_assignments
    end

    it "rejects invalid assignments" do
      user.valid_assignments.each do |assignment|
        allow(@client).to receive(:accept_assignment, {assignment_id: assignment.assignment_id}).and_return(true)
      end

      expect(@user.do_work).to have 1_incomplete_assignment
    end
  end
end

当我尝试将参数传递给存根方法时,我收到此错误:

ArgumentError: wrong number of arguments (2 for 1)
ruby-on-rails ruby rspec
1个回答
0
投票

我认为这是一个语法问题。使用参数(根据https://relishapp.com/rspec/rspec-mocks/v/2-99/docs/method-stubs)存根方法的格式为:

允许(obj)。接收(:message).with('an argument'){...}

但是你将你期望的参数作为次要参数传递给接收(...),这就是为什么它抱怨它只需要1个参数。

将您的规格更改为:

describe "#do_work" do
  context "when two assignments are valid" do
    before :context do
      @user = User.create!({name: "Bob"})
      [{assignment_id: "1", valid: false}, {assignment_id: 2, valid: false}, {assignment_id: "3", valid: true}].each do |assignment|
        @user.assignments.create!(assignment)
      end
      @client = ExpensiveAPI.new
      @user.client = @client
    end
  end

  describe "#do_work" do
    it "accepts valid assignments" do
      user.valid_assignments.each do |assignment|
        allow(@client).to receive(:accept_assignment).with({assignment_id: assignment.assignment_id}).and_return(true)
      end

      expect(@user.do_work).to have 2_completed_assignments
    end

    it "rejects invalid assignments" do
      user.valid_assignments.each do |assignment|
        allow(@client).to receive(:accept_assignment).with({assignment_id: assignment.assignment_id}).and_return(true)
      end

      expect(@user.do_work).to have 1_incomplete_assignment
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.