Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby RSPEC调用方法错误_Ruby_Methods_Rspec_Tdd_Call - Fatal编程技术网

Ruby RSPEC调用方法错误

Ruby RSPEC调用方法错误,ruby,methods,rspec,tdd,call,Ruby,Methods,Rspec,Tdd,Call,下面是给出错误/错误的方法: def draw?(board) if full?(board) == true && won?(board) == false return true else return false end end 该方法完成了应该执行的所有操作,但这是我运行rspec文件时出现的错误: 1) ./lib/tic_tac_toe.rb #draw? calls won? and full?

下面是给出错误/错误的方法:

def draw?(board)
    if full?(board) == true && won?(board) == false
        return true
    else
        return false
    end
end
该方法完成了应该执行的所有操作,但这是我运行rspec文件时出现的错误:

1) ./lib/tic_tac_toe.rb #draw? calls won? and full?                                                                                    
     Failure/Error: expect(self).to receive(:won?).with(board)                                                                           
       (#<RSpec::ExampleGroups::LibTicTacToeRb::Draw:0x00000002e300b0>).won?(["X", "O", "X", "O", "X", "X", "O", "X", "O"])              
           expected: 1 time with arguments: (["X", "O", "X", "O", "X", "X", "O", "X", "O"])                                              
           received: 0 times 
基本上,我读到:画画?没有打满电话?赢了

但是当我看我的画的时候?方法,我叫他们!好像有条件的

那么我错在哪里呢

非常感谢您的帮助

我目前正在学习Ruby。

1你的全部绘画作品?方法可以简化为一行:全板&!韩元?董事会

2如果您正在测试类方法,您需要监视类的实例或类本身。您使用的是self,它将是RSpec本身,而不是您正在测试的底层类。既然我不知道它的名字,我就假设它叫游戏。试着这样做:

describe '#draw?' do
  it 'calls draw? and full?' do
    board = ["X", "O", "X", "O", "X", "X", "O", "X", "O"]
    game = Game.new
    expect(game).to receive(:won?).with(board)
    expect(game).to receive(:full?).with(board)
    game.draw?
  end
end
3这里的另一个问题是,您希望两个方法都被调用,但都赢了?满了就不叫了?返回false。这是由于。在所有语句都必须求值为真或假的情况下,一旦其中一个语句不求值,其余语句将不求值。想一想这样的例子:if user!=nil&&user.admin?。您需要在这里短路,以便在第一个语句不为真时不会对第二个语句求值。一般来说,评估输出无关紧要的语句是不必要的资源使用


4最后,一般来说,最好是测试函数的输出,而不是测试函数的内部工作方式。最好进行一系列测试,在这些测试中传递数据,然后期望结果。

我忘记了短路,谢谢!这是我正在学习的在线课程的一部分,我不应该接触测试,但是测试函数的输出确实更有意义!Rspec仍然为我为一个tic-tac-toe游戏所做的整体CLI抛出错误,尽管它工作得很好。所以我继续前进。非常感谢您的信息!
describe '#draw?' do
  it 'calls draw? and full?' do
    board = ["X", "O", "X", "O", "X", "X", "O", "X", "O"]
    game = Game.new
    expect(game).to receive(:won?).with(board)
    expect(game).to receive(:full?).with(board)
    game.draw?
  end
end