期待字符串但在Rspec测试中变为零

时间:2015-11-30 04:19:38

标签: ruby-on-rails ruby rspec

我正在研究一个名为"说奶奶"的Ruby问题。我需要创建一个方法,该方法应该包含一个包含短语的字符串参数,并检查该短语是否全部用大写写成:如果它不是,那么祖母就听不到你的意思。她应该回复(返回)HUH?!说起来,SONNY!。

然而,如果你对她大喊大叫(即用一个包含全部大写的短语的字符串参数调用方法,那么她可以听到你(或者至少她认为她可以)并且应该回复(返回)NO ,不是从1938年开始!。

我写了以下代码:

def speak_to_grandma(input)
if
  input != input.upcase
  puts 'HUH?! SPEAK UP, SONNY!' 
else
  puts 'NO, NOT SINCE 1938!'
end
end

当我运行RSpec时,我都失败了。它给出了以下信息:

Failure/Error: expect(speak_to_grandma('Hi Nana, how are you?')).to eq 'HUH?! SPEAK UP, SONNY!'
       expected: "HUH?! SPEAK UP, SONNY!"
            got: nil 

 Failure/Error: expect(speak_to_grandma('WHAT DID YOU EAT TODAY?')).to eq "NO,          NOT SINCE 1938!"
       expected: "NO, NOT SINCE 1938!"
            got: nil
       (compared using ==)

我不知道我在这里做错了什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

speak_to_grandma方法返回puts方法的返回值,该方法是方法中的最后一行。 puts的返回值为nilWhy are all my puts returning =>nil?

Rspec中的eq方法检查方法的返回值。该字符串以puts输出到屏幕,但返回值为nil,这是Rspec正在检查的内容。

如果删除puts,测试应该通过,因为字符串将是方法的返回值。但正确的方法是使用Rspec中的output方法对其进行测试。写下你的测试:

expect { speak_to_grandma('WHAT DID YOU EAT TODAY?') }.to output("NO, NOT SINCE 1938!").to_stdout