Ruby测试循环的结果

时间:2015-11-04 20:07:56

标签: ruby loops testing rspec

快速测试问题我有一个FizzBu​​zz实现,

def fizzbuzz(n)
  (1..n).each do |num|
    string = ''
    string << 'Fizz' if num % 3 == 0
    string << 'Buzz' if num % 5 == 0
    string << 'Boom' if num % 7 == 0
    string = num if string.empty?
    puts string
  end
end

我想为它写一个测试:

it 'should return the word Fizz for a number divisible by 3' do 
  expect(Thing.fizzbuzz(3)).to eq ("Fizz")
end

我得到了

 Failure/Error: expect(@thing.fizzbuzz(3)).to eq ("Fizz")

   expected: "Fizz"
        got: 1..3

现在我知道实际结果更像是

1
2 
'fizz'

但它让我思考如何写这个以便它很容易测试? 我可以将每个实例铲成一个数组,然后测试特定的位置,但有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您当前的方法是puts STDOUT的值。这使得很难测试。更改方法以将值作为数组返回。然后测试那个数组。

这样的事情:

def fizzbuzz(n)
  (1..n).map do |num|
    # logic here...
    string
  end
end

你的测试就变成了这个:

expect(@thing.fizzbuzz(3)).to eq [1, 2, "Fizz"]

或许这个:

expect(@thing.fizzbuzz(3)[2]).to eq "Fizz"