簡體   English   中英

使用Rspec存根昂貴的方法

[英]Stubbing a costly method with Rspec

在以下情況下,我只想將哈希傳遞給存根測試雙。 我不想測試雙重本身。 但是我需要在測試中模仿它。 實際方法如下所示:

# 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)

我認為這是一個語法問題。 使用參數對方法進行存根的格式(按照https://relishapp.com/rspec/rspec-mocks/v/2-99/docs/method-stubs )為:

allow(obj).to接收(:message).with('一個參數'){...}

但是您將期望的參數作為第二個參數傳遞給receive(...),這就是為什么它抱怨只需要一個參數。

將您的規格更改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM