2017-08-03 116 views
0

我想创建一个方法,接受用户输入。它将用户输入变成一个整数,然后从用户输入中减去一个。如果用户输入不是数字,它也会返回-1。但是测试会引发错误。 enter image description hereRuby方法无法通过Rspec测试

describe '#input_to_index' do 

    it 'converts a user_input to an integer' do 
     user_input = "1" 

     expect(input_to_index(user_input)).to be_a(Fixnum) 
    end 

    it 'subtracts 1 from the user_input' do 
     user_input = "6" 

     expect(input_to_index(user_input)).to be(5) 
    end 

    it 'returns -1 for strings without integers' do 
     user_input = "invalid" 

     expect(input_to_index(user_input)).to be(-1) 
    end 

    end 

这里是我的方法:

def input_to_index(user_input) 
    user_input = user_input.to_i 
    user_input = user_input - 1 
    return -1 if !user_input.is_a? Numeric 
end 

回答

3

这是因为你只回来的东西if !user_input.is_a?(Numeric)和你已经投user_input到整数。

-1 if false # => nil 
-1 if true # => -1 

因此,在方法最后一行返回nil,因为这个条件是永远不会得到满足。

"a".to_i # => 0 
"a".to_i.is_a?(Numeric) # => true 
("a".to_i - 1).is_a?(Numeric) # => true 

你甚至不需要最后一行在所有事情会很好地工作:

def input_to_index(user_input) 
    user_input = user_input.to_i 
    user_input = user_input - 1 
end 
input_to_index("1") # => 0 
input_to_index("6") # => 5 
input_to_index("invalid") # => -1 

和更简洁:

def input_to_index(user_input) 
    user_input.to_i - 1 
end 
input_to_index("1") # => 0 
input_to_index("6") # => 5 
input_to_index("invalid") # => -1 
1

我敢肯定有一个更雄辩的方式来做到这一点,但你可以这样做:

def input_to_index(user_input) 
    user_input = user_input.to_i 
    user_input = user_input - 1 
    if !user_input.is_a? Numeric 
    -1 
    else 
    user_input 
    end 
end 

编辑

这可能是一个更有说服力的方法:

def input_to_index(user_input) 
    user_input = user_input.to_i - 1 
    !user_input.is_a?(Numeric) ? -1 : user_input 
end 

下面是做的最有说服力的方式:

def input_to_index(user_input) 
    user_input.to_i - 1 
end 

信用:简单的石灰

+0

后'USER_INPUT = user_input.to_i',它总是*一个'整数',因此是'数字'。因此'if'分支永远不会匹配。你总是去'else'分支。 –

+0

我想说的是,在你检查它的地方,'user_input'永远不会是'Numeric'。因此没有必要检查。 –

+0

这是正确的。 – Asdrubal