2015-10-17 99 views
0

如何为以下内容编写rspec测试?如何为此编写rspec 3.1测试

是获取这是传递的值... 90A14F 1.4

def classname 
    def init 
     @input_colors = Array.new 
    end 
    def speak 
     puts "enter your line of color values" 
     result = STDIN.gets.chomp 
     new_result = result.gsub!(/([\s])+/,':') 
     @input_colors << new_result 
    end 
    end 

我怎样写一个RSpec 3.1测试对于测试,如果gets.chomp是这样讲的方法... 90A14F 1.4

他们将得到一个实例var @input_colors == [“90A14F:1.4”]

回答

0

您的示例中存在一些问题。顺便说一句

describe ColorReader do 
    describe '#read' do 
    let(:input) { "90A14F 1.4\n" } 

    subject(:color_reader) { ColorReader.new } 

    before do 
     allow(color_reader).to receive(:puts).and_return(nil) 
     allow(STDIN).to receive(:gets).and_return(input) 
    end 

    it 'writes to the console' do 
     color_reader.read 
     expect(color_reader).to have_received(:puts). 
     with("enter your line of color values").once 
    end 

    it 'reads from STDIN' do 
     color_reader.read 
     expect(STDIN).to have_received(:gets).once 
    end 

    it 'returns the sanitized input' do 
     expect(color_reader.read).to eq(['90A14F:1.4']) 
    end 
    end 
end 

:我喜欢这种改变,并修复它的东西:

class ColorReader   # with `class` and an upcase class name 
    def initialize    # not `init` 
    @colors = []    # the use of `Array.new` is uncommon 
    end 

    def read 
    puts "enter your line of color values" 
    result = STDIN.gets.chomp 
    new_result = result.gsub!(/([\s])+/,':') 
    @colors << new_result 
    end 
end 

然后在测试看起来是这样的。我宁愿明确测试@colors阵列的新值(可能与attr_reader :colors),而不是read方法的implizit返回值。如果您有@colors的阅读器,则最后一个规格可以更改为:

it 'adds the sanitized input to `colors`' do 
    expect { 
    color_reader.read 
    }.to change { color_reader.colors }.from([]).to(['90A14F:1.4']) 
end