Ruby 和 RSpec - 当预期输出与方法相同时测试失败

Ruby and RSpec - Test fails when expected output is the same as the method

我知道我在这里遗漏了一些简单的东西。我想编写一个测试来检查是否已经输出了数组数组。测试一直失败,但测试期望的与方法给出的相同。

connect4.rb

class Board
  attr_accessor :board
  def make_and_print_board
    grid = Array.new(6) { Array.new(6)}
    p grid
  end
end

connect4_spec.rb

require  './lib/connect4'


RSpec.describe Board do
  let (:new_board) {Board.new}
  it "prints board" do
    expect{new_board.make_and_print_board}.to output(
      Array.new(6) { Array.new(6)}
    ).to_stdout
  end
end


这是错误...

 1) Board prints board
     Failure/Error:
           expect{new_board.make_and_print_board}.to output(
             Array.new(6) { Array.new(6)}

           ).to_stdout

       expected block to output [[nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil]] to stdout, but output "[nil, nil, nil, nil, nil, nil]\n[nil, nil, nil, nil, nil, nil]\n[nil, nil, nil, nil, nil, nil]\n[nil, nil, nil, nil, nil, nil]\n[nil, nil, nil, nil, nil, nil]\n[nil, nil, nil, nil, nil, nil]\n"

我在这里错过了什么?怎么还不过去我怎样才能通过这个测试?

编写此测试的正确方法是详细说明您的期望。测试你期望 ii 给出的确切值。 p 会输出一个新行所以这样写。

RSpec.describe Board do
  let (:new_board) {Board.new}
  it 'prints board' do
    p_output = "[[nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil]]\n"

    expect{new_board.make_and_print_board}.to output(p_output).to_stdout
  end
end

但如果您更关心内部结构,则可能需要添加此规范:

  it 'it outputs a 6 x 6 2d array' do
    expect( new_board.make_and_print_board ).to match_array Array.new(6) { Array.new(6)} 
  end