Ruby方法无法通过Rspec测试

时间:2017-08-03 03:15:15

标签: ruby rspec

我正在尝试创建一个接受用户输入的方法。它将用户输入转换为整数,然后从用户输入中减去一个。如果用户输入不是数字,它也返回-1。但是测试会引发错误。enter image description here

  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

2 个答案:

答案 0 :(得分: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 :(得分: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

Credit:Simple Lime