RSPEC调用方法错误

时间:2017-01-23 04:56:49

标签: 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?                                                                                    
     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 

这是rspec测试:

describe '#draw?' do

    it 'calls won? and full?' do
      board = ["X", "O", "X", "O", "X", "X", "O", "X", "O"]
      expect(self).to receive(:won?).with(board)
      expect(self).to receive(:full?).with(board)

      draw?(board)
    end

基本上,我读过: #draw?没有打电话给#full?和#won?

但是当我看着我的#draw?方法,我打电话给他们!作为“if”条件!

所以我哪里出错?

非常感谢帮助!

我正在学习Ruby。

1 个答案:

答案 0 :(得分:1)

1)您的整个draw?方法可以简化为一行:full?(board) && !won?(board)

2)如果您正在测试类方法,则需要您的expect监视类的实例或类本身。您正在使用self,这将是RSpec本身,不是您正在测试的基础类。由于我不知道它的名称,我将假设它被称为Game。尝试这样的事情:

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)此处的另一个问题是,您希望调用这两种方法,但如果won?返回full?,则不会调用false。这是由于short circuiting。在所有语句必须评估为true(或false)的情况下,如果其中一个语句没有,则不评估其余语句。想想一个例子:if user != nil && user.admin?。你想要在这里短路,这样如果第一个不是真的话,就不会评估第二个语句。一般而言,不必要地使用资源来评估其输出无关紧要的陈述。

4)最后,一般来说,你最好测试函数的输出而不是它的工作原理。最好先进行一系列测试,然后传递数据,然后expect结果。