Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Rspec测试用例不工作_Ruby_Rspec - Fatal编程技术网

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
实例返回结果。然后,测试变得几乎微不足道,这正是我们想要的(没有人愿意想得太多)