[英]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.