为什么我的模拟不能在我最小的测试运行中使用?

Dav*_*ave 5 mocking stub minitest ruby-on-rails-5

我正在尝试使用Rails 5编写测试并使用minitest这是我的测试代码...

@client = Coinbase::Wallet::Client.new(api_key: ENV['COINBASE_KEY'], api_secret: ENV['COINBASE_SECRET'])
sell_price = 4000
assert sell_price > last_buy_price * (1 + MoneyMakerThreshhold.find_buy.pct_change)
@client.stub :sell_price, "USD" do
  {"base"=>"BTC", "currency"=>"USD", "amount"=>"#{sell_price}"}
end

svc = CryptoCurrencyService.new
svc.sell(last_transaction)
Run Code Online (Sandbox Code Playgroud)

但是当它在下面的特征中打印出来的不是我嘲笑的售价"4000"时,它是客户退回的实际售价...

  def sell(last_transaction)
    client = Coinbase::Wallet::Client.new(api_key: ENV['COINBASE_KEY'], api_secret: ENV['COINBASE_SECRET'])
    sell_price = client.sell_price(currency: 'USD').amount
    puts "buy: #{last_transaction.btc_price_in_usd} sellprice: #{sell_price} last:#{last_transaction.btc_price_in_usd}"
Run Code Online (Sandbox Code Playgroud)

如何让我的模拟成功?

Hir*_*103 0

正如文档所述, Object#stub在块的持续时间内存根方法值

添加一个临时存根方法,在块的持续时间内替换名称。如果 val_or_callable 响应#call,则返回调用它的结果,否则按原样返回值。清理块末尾的存根。

回答你原来的问题:

client.stub :sell_price, {"base"=>"BTC", "currency"=>"USD", "amount"=>"#{sell_price}"} do
  svc = CryptoCurrencyService.new
  svc.sell(last_transaction)  
end
Run Code Online (Sandbox Code Playgroud)