2017-08-03 187 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

相關問題