Ruby Rspec测试用例不工作
我可能犯了一些愚蠢的错误,但通过运行Ruby Rspec测试用例不工作,ruby,rspec,Ruby,Rspec,我可能犯了一些愚蠢的错误,但通过运行rake可以看出这一点 由于无限循环,它无限地运行,直到我停止它 文件夹结构如下所示: 计算器.rb class Calculator attr_accessor :result def initialize @result = 0.0 end def add(param) @result += param end def subtract(param)
rake
可以看出这一点
由于无限循环,它无限地运行,直到我停止它
文件夹结构如下所示:
计算器.rb
class Calculator
attr_accessor :result
def initialize
@result = 0.0
end
def add(param)
@result += param
end
def subtract(param)
@result -= param
end
def multiply(param)
@result *= param
end
def divide(param)
@result /= param
end
def cancel
@result = 0.0
end
end
class CommandProcessor
attr_accessor :input
attr_accessor :operation
attr_accessor :calculator
def parser
calculator = Calculator.new
while true
input = gets.to_s.chomp
operation = input.split(' ')[0]
param = input.split(' ')[1]
if operation.eql? 'exit'
exit
elsif operation.eql? 'add'
calculator.add(param.to_f)
puts calculator.result
elsif operation.eql? 'subtract'
calculator.subtract(param.to_f)
puts calculator.result
elsif operation.eql? 'multiply'
calculator.multiply(param.to_f)
puts calculator.result
elsif operation.eql? 'divide'
calculator.divide(param.to_f)
puts calculator.result
elsif operation.eql? 'cancel'
calculator.cancel
puts calculator.result
else
puts "invalid op"
end
end
end
end
command = CommandProcessor.new
command.parser
require 'spec_helper'
require "calculator.rb"
describe "CommandProcessor" do
it "will exit on input exit" do
@cmd = CommandProcessor.new
@cmd.stub!(:gets).and_return("add 3\n")
@cmd.parser
expect(@cmd.calculator.result).to eq 3
end
end
describe "Calculator" do
it "will add a number" do
calculator = Calculator.new
expect(calculator.add 2).to eq 2.0
expect(calculator.add 2.0).to eq 4.0
end
it "will subtract a number" do
calculator = Calculator.new
expect(calculator.subtract 2).to eq -2.0
expect(calculator.subtract 2.0).to eq -4.0
end
it "will multiply a number" do
calculator = Calculator.new
expect(calculator.multiply 2).to eq 0.0
expect(calculator.multiply 2.0).to eq 0.0
end
it "will divide a number" do
calculator = Calculator.new
expect(calculator.divide 2).to eq 0.0
expect(calculator.divide 2.0).to eq 0.0
end
it "will make result zero on cancel" do
calculator = Calculator.new
calculator.cancel
expect(calculator.result).to eq 0.0
end
end
计算器规格rb
class Calculator
attr_accessor :result
def initialize
@result = 0.0
end
def add(param)
@result += param
end
def subtract(param)
@result -= param
end
def multiply(param)
@result *= param
end
def divide(param)
@result /= param
end
def cancel
@result = 0.0
end
end
class CommandProcessor
attr_accessor :input
attr_accessor :operation
attr_accessor :calculator
def parser
calculator = Calculator.new
while true
input = gets.to_s.chomp
operation = input.split(' ')[0]
param = input.split(' ')[1]
if operation.eql? 'exit'
exit
elsif operation.eql? 'add'
calculator.add(param.to_f)
puts calculator.result
elsif operation.eql? 'subtract'
calculator.subtract(param.to_f)
puts calculator.result
elsif operation.eql? 'multiply'
calculator.multiply(param.to_f)
puts calculator.result
elsif operation.eql? 'divide'
calculator.divide(param.to_f)
puts calculator.result
elsif operation.eql? 'cancel'
calculator.cancel
puts calculator.result
else
puts "invalid op"
end
end
end
end
command = CommandProcessor.new
command.parser
require 'spec_helper'
require "calculator.rb"
describe "CommandProcessor" do
it "will exit on input exit" do
@cmd = CommandProcessor.new
@cmd.stub!(:gets).and_return("add 3\n")
@cmd.parser
expect(@cmd.calculator.result).to eq 3
end
end
describe "Calculator" do
it "will add a number" do
calculator = Calculator.new
expect(calculator.add 2).to eq 2.0
expect(calculator.add 2.0).to eq 4.0
end
it "will subtract a number" do
calculator = Calculator.new
expect(calculator.subtract 2).to eq -2.0
expect(calculator.subtract 2.0).to eq -4.0
end
it "will multiply a number" do
calculator = Calculator.new
expect(calculator.multiply 2).to eq 0.0
expect(calculator.multiply 2.0).to eq 0.0
end
it "will divide a number" do
calculator = Calculator.new
expect(calculator.divide 2).to eq 0.0
expect(calculator.divide 2.0).to eq 0.0
end
it "will make result zero on cancel" do
calculator = Calculator.new
calculator.cancel
expect(calculator.result).to eq 0.0
end
end
我是否构造了错误的代码,或者我的测试是错误的?代码可以正常工作,但测试用例不能正常工作。无限循环的罪魁祸首是您在
CommandProcessor\parser
中介绍的那个
我相信问题在于你在你的对象上存根get
,但实际上,它是在上定义的,所以如果你要存根在任何地方,那就是哪里。这意味着gets
可能返回了解析器不理解的某种废话,这导致了您看到的无效op
的无限循环。在这种情况下,打印无效操作的内容可能很有用(即将put“invalid op”
更改为put“invalid op:#{operation}”
)
值得注意的是,即使存根已经工作,并且您不断获得add3
而不是垃圾数据,您的编程仍然会永远循环,因为解析器永远不会收到exit
,它需要从循环中断开
在我看来,这个问题表明了另一个问题:您试图一次性测试两件事:解析器和IO。我建议更改您的界面,以便您的CommandProcessor.parse
获取一个字符串,对其进行解析,并从内部Calculator
实例返回结果。然后,测试变得几乎微不足道,这正是我们想要的(没有人愿意想得太多)