0

RSpec を使用してメッセージのメソッドをテストするにはどうすればよいですか? 基本的に、私のメソッドは 2 つのパラメーターを受け入れます。適切な詳細が提供されていれば、成功メッセージが表示されます。私はこれを試しました:

DRINKS_MACHINE = {
  'Coca Cola' => 2.99,
  'Fanta' => 3.27,
  'Beer' => 5.99
}

class Drink
  def check_money(drink_selection, money_amount_paid)
    amount_paid = money_amount_paid.to_f
    if amount_paid <= 0
      raise ArgumentError, 'Insert Money'
    end
    if not DRINKS_MACHINE.has_key?(drink_selection)
      raise ArgumentError, "Invalid selection: #{drink_selection}"
    end
    cost = DRINKS_MACHINE[drink_selection]
    if amount_paid < cost
      remainder = amount_paid - cost
      raise ArgumentError, "Not enough coins. Insert #{remainder} more!"
    elsif
      puts "Purchase Complete: #{drink_selection}"
    end
  end
end

有効な選択と十分な金額がメソッドに渡されると、正しいメッセージが返されることをテストしたいと思います。この場合、メッセージには、メソッドに渡された文字列変数も含まれます。私は次のことを試しました:expect @method.check_money("Coca Cola", "5.00").raise ("Purchase Complete : Coca Cola"). も試しました@method.check_money("Coca Cola", "4.59").should eq ("Purchase Complete: Coca Cola")

4

2 に答える 2

2

ユースケースを簡素化

メソッドのテストで問題が発生した場合は、大きな泥の塊を解決しようとするのではなく、メソッドを単純化する必要があります。

ロジックと構文が間違っています

あなたの構文には、いくつかの明白な問題があります。これはCode Review Stack Exchangeではありませんが、混乱を避けるためにコードをリファクタリングすることを強くお勧めします。特に、可能性の高い結果を得るために、あらゆる場所で例外を発生させるのをやめます。適切なケース ステートメントを使用すると、生活が大幅に簡素化されます。

クラスとテスト、リファクタリング

次のコードは、クラスで探しているコア機能を実行します。

class Drink
  DRINKS_MACHINE = {
    'Coca Cola' => 2.99,
    'Fanta'     => 3.27,
    'Beer'      => 5.99
  }   

  def check_money(drink_selection, money_amount_paid)
    amount_paid = money_amount_paid.to_f
    cost = DRINKS_MACHINE[drink_selection]
    if amount_paid < cost
      remainder = amount_paid - cost
      raise ArgumentError, "Not enough coins. Insert #{remainder} more!"
    else
      "Purchase Complete: #{drink_selection}"
    end
  end
end

describe Drink do
  describe '#check_money' do
    it 'sells a drink' do
      subject.check_money('Coca Cola', 2.99).should == "Purchase Complete: Coca Cola"
    end
  end
end

特に、メソッドから結果を返し (#puts は nil を返す)、DRINKS_MACHINE 定数がクラスと仕様の両方で使用できるようにする必要があります。

于 2013-03-31T17:44:30.230 に答える