Minitest 不会通过,尽管使用 binding.pry 检查标准是正确的

Minitest won't pass, although criteria are correct when checked with binding.pry

这是被测试的对象

class Ship
attr_reader :size, :x, :y, :axis

def initialize size
    @size = size
end

def length
    @size = size
end

def place x, y, axis
    @x = x
    @y = y
    @axis = axis
end

def covers? a, b
    x = @x
    y = @y

    if x == a and y == b
        return true
    else
        (@size - 1).times do
            if @axis
                x += 1
            else
                y += 1
            end
            return true if x == a and y == b
        end
        false
    end
 end

结束

这个测试会通过

def test_08_ship_can_be_placed_across
    ship = Ship.new(4)
    assert ship.place(2, 1, true)

    assert ship.covers?(2, 1)
    assert ship.covers?(3, 1)
    assert ship.covers?(4, 1)
    assert ship.covers?(5, 1)

    refute ship.covers?(1, 1)
    refute ship.covers?(6, 1)
    refute ship.covers?(4, 2)
 end

这是不会通过的测试

def test_09_ship_can_be_placed_down

    ship = Ship.new(4)
    assert ship.place(2, 2, false)

    refute ship.covers?(2, 1)

    assert ship.covers?(2, 2)
    assert ship.covers?(2, 3)
    assert ship.covers?(2, 4)
    assert ship.covers?(2, 5)

    refute ship.covers?(2, 6)
    refute ship.covers?(3, 2)

  end

如果我在 ship.covers 上做 binding.pry?使用这些参数中的任何一个,我都会得到正确的答案。由于某种原因,测试仍然无法通过...

这是错误信息。信息不多...

1) Failure:
BattleshipTest#test_09_ship_can_be_placed_down [battleship_minitest.rb:73]:
Failed assertion, no message given.

Binding.pry 测试通过

[1] pry(main)> ship1.covers?(2, 1)
=> true
[2] pry(main)> ship1.covers?(3, 1)
=> true
[3] pry(main)> ship1.covers?(4, 1)
=> true
[4] pry(main)> ship1.covers?(5, 1)
=> true
[5] pry(main)> ship1.covers?(1, 1)
=> false
[6] pry(main)> ship1.covers?(6, 1)
=> false
[7] pry(main)> ship1.covers?(4, 2)
=> false

Binding.pry 对于失败的测试

[1] pry(main)> ship2.covers?(2, 1)
=> false
[2] pry(main)> ship2.covers?(2, 2)
=> true
[3] pry(main)> ship2.covers?(2, 3)
=> true
[4] pry(main)> ship2.covers?(2, 4)
=> true
[5] pry(main)> ship2.covers?(2, 5)
=> true
[6] pry(main)> ship2.covers?(2, 6)
=> false
[7] pry(main)> ship2.covers?(3, 2)
=> false

你在断言一个备考方法(我的想法):

assert ship.place(2, 1, false)

ship.place returns 轴的值,因为它是在方法中最后分配的。它适用于第一种情况,因为 axis 设置为 true。