簡體   English   中英

RSpec:模擬不適用於實例方法和多個調用

[英]RSpec: Mock not working for instance method and multiple calls

我正在嘗試模擬下面的PriceInspector#get_latest_price來測試OderForm 傳遞了兩個訂單,因此,在PriceInspector#get_latest_price時,我需要返回兩個不同的值。 一切都可以與Supplier模型(ActiveRecord)正常工作,但是我無法在PriceInspector類上運行模擬:

# inside the test / example
expect(Supplier).to receive(:find).and_return(supplier_1) # first call, works
expect(PriceInspector).to receive(:get_latest_price).and_return(price_item_1_supplier_1) # returns nil
expect(Supplier).to receive(:find).and_return(supplier_2) # second call, works
expect(PriceInspector).to receive(:get_latest_price).and_return(price_item_2_supplier_1) # returns nil

class OrderForm
  include ActiveModel::Model

  def initialize(purchaser)
    @purchaser = purchaser
  end  

  def submit(orders)        
    orders.each do |supplier_id, order_items|      
      @supplier = Organization.find(supplier_id.to_i)
      @order_item = OrderItem.save(                    
        price_unit_price: PriceInspector.new(@purchaser).get_latest_price.price_unit_price
      )
      [...]
    end
  end
end

class PriceInspector
  def initialize(purchaser)
    @purchaser = purchaser    
  end

  def get_latest_price
    [...]
  end
end

編輯

這是根據轉向架的答案更新的測試代碼:

before(:each) do        
  expect(Organization).to receive(:find).and_return(supplier_1, supplier_2)

  price_inspector = PriceInspector.new(purchaser, item_1)
  PriceInspector.stub(:new).and_return price_inspector
  expect(price_inspector).to receive(:get_latest_price).and_return(price_item_1_supplier_1)  
  expect(price_inspector).to receive(:get_latest_price).and_return(price_item_2_supplier_2)                
end

it "saves correct price_unit_price for first OrderItem", :focus do        
  order_form.submit(params)
  expect(OrderItem.first.price_unit_price).to be_within(0.01).of(price_item_1_supplier_1.price_unit_price)  
end

我認為這應該可以解決實例方法的問題,並允許您檢查兩種不同的收益(前提是您通過了購買者或雙重購買):

price_inspector = PriceInspector.new(purchaser)
PriceInspector.stub(:new).and_return price_inspector

expect(price_inspector).to receive(:get_latest_price).and_return(price_item_1_supplier_1)
expect(price_inspector).to receive(:get_latest_price).and_return(price_item_2_supplier_1)

暫無
暫無

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

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