TDD。请帮我解决错误

时间:2013-04-02 18:03:34

标签: ruby tdd

TDD:

describe RPNCalculator do

  attr_accessor :calculator

  before do
    @calculator = RPNCalculator.new
  end

it "adds two numbers" do
  calculator.push(2)
  calculator.push(3)
  calculator.plus
  calculator.value.should == 5
end
end

我的代码:

class RPNCalculator
attr_accessor :calculator

def initialize()
  @calculator = []
end

def RPNCalculator(x=0,y=0)
@calculator.push(x)
@calculator.push(y)
@calculator.map {|x,y| x + y }
end

错误:

RPNCalculator
adds two numbers (FAILED - 1)

故障:

1)RPNCalculator adds two numbers
Failure/Error: calculator.push(2)
NoMethodError:
undefined method `push' for #<RPNCalculator:0x000000021b85a8 @calculator=[]>

2 个答案:

答案 0 :(得分:1)

您的测试中出现的问题是calculator.push(2)。您在没有名为RPNCalculator的方法的对象push上调用它。它是类中的实例变量@calculator,您实例化为Array,它具有该方法。

您的测试应该是:

it "adds two numbers" do
  @calculator.RPNCalculator(2,3).value.should == 5
end

我应该指出,有一个以大写字母开头的方法名称被认为是不好的形式。

如果我可能非常大胆地猜测您的测试尝试了什么,那么您希望将push个数字输入RPNCalculator并继续推送数字并获得这些数字的总和随意。如果情况确实如此,您可能正在寻找类似的东西:

class RPNCalculator
attr_accessor :calculator

def initialize()
  @calculator = []
end

def push(*num)
  # Use is_a? in order to ensure anything added to
  # the Array can later be added together 
  @calculator.push(*num) if num.all? {|n| n.is_a? Numeric}
  # If you would like this to work with any class that can be added
  # then change 'n.is_a? Numeric' to 'n.respond_to? :+'
end

def plus
  @calculator.reduce(:+)
end

def value
  plus
end

这样做可以使您的原始测试无需更改。

使用示例:

calc = RPNCalculator.new
calc.push(3)
calc.push(2)
calc.plus #=> 5
calc.push(6)
calc.plus #=> 8   
calc.push(1,2,3,4)
calc.plus #=> 18

注意我在方法定义中使用了splat运算符(星号)。我建议在这个主题上做一些reading。值得学习和爱。

答案 1 :(得分:0)

试试这个:

class RPNCalculator
attr_accessor :calculator

def initialize()
  @calculator = []
end

def RPNCalculator(x=0,y=0)
  @calculator.push(x)
  @calculator.push(y)
  p @calculator.reduce(&:+)
end
end

cal = RPNCalculator.new
cal.RPNCalculator(10,20) #30