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

这里有两个不同的问题,一个与您的规范有关,另一个与您的方法有关。

在您的规范中,您应该将eq其用作匹配器,因为您期望从该check_money方法返回字符串。

@method.check_money("Coca Cola", "5.00").should eq("Purchase Complete: Coca Cola")

在您的方法中,您应该简单地使用

"Purchase Complete: #{drink_selection}"

并摆脱puts, 因为这是输出到控制台而不是返回字符串。

elsif另外,else在上一行中切换。

于 2013-03-31T16:45:40.700 回答
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 回答