如何使用RSpec测试字符串的方法?

时间:2013-03-31 16:26:11

标签: ruby rspec return-value

如何使用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")

2 个答案:

答案 0 :(得分:2)

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

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

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

在您的方法中,您应该使用

"Purchase Complete: #{drink_selection}"

并删除puts,因为它输出到控制台而不是返回字符串。

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

答案 1 :(得分: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常量。