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=[]>
答案 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