2016-03-01 107 views
0

我有一个简单的功能。RSpec失败raise_error

def check_num(num) 
    if num.is_a?(Integer) && num > 0 
    #... 
    else 
    raise 'NOT VALID' 
    end 
end 

,并试图与下面的测试使用RSpec来测试它:

require 'find' 

describe 'check_num' do 

    describe 'errors' do 

    it 'raises an error if parameter is 0' do 
     expect(check_num(0)).to raise_error(RuntimeError) 
    end 

    it 'raises an error if parameter is less than 0' do 
     expect(check_num(-1)).to raise_error(RuntimeError) 
    end 

    it 'raises an error if parameter is not a number' do 
     expect(check_num('Heya, Am a string')).to raise_error(RuntimeError) 
    end 

    end 

end 

而且这是我和我的测试得到:

/home/duke/.rvm/rubies/ruby-2.2.3/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /home/duke/.rvm/gems/ruby-2.2.3/bin/rspec /home/duke/RubymineProjects/rspec_tutor/prime_numbers/spec/find_spec.rb --require teamcity/spec/runner/formatter/teamcity/formatter --format Spec::Runner::Formatter::TeamcityFormatter 
Testing started at 15:04 ... 

RuntimeError: NOT VALID 
./lib/find.rb:37:in `check_num' 
./spec/find_spec.rb:8:in `block (3 levels) in <top (required)>' 
-e:1:in `load' 
-e:1:in `<main>' 

RuntimeError: NOT VALID 
./lib/find.rb:37:in `check_num' 
./spec/find_spec.rb:12:in `block (3 levels) in <top (required)>' 
-e:1:in `load' 
-e:1:in `<main>' 

ArgumentError: comparison of String with 0 failed 
./lib/find.rb:28:in `>' 
./lib/find.rb:28:in `check_num' 
./spec/find_spec.rb:16:in `block (3 levels) in <top (required)>' 
-e:1:in `load' 
-e:1:in `<main>' 

3 examples, 3 failures, 0 passed 

Finished in 0.004547262 seconds 

Process finished with exit code 1 

为什么我收到一个错误而raise_error是我正在测试的内容? 我应该如何测试错误提升呢?

回答

2

你必须移动饲养错误方法块,像这样:

expect {check_num(0)}.to raise_error