【问题标题】:RSPEC Calling Methods ErrorRSPEC 调用方法错误
【发布时间】:2017-06-07 13:21:19
【问题描述】:

这是给出错误/失败的方法:

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 时?方法,我确实称它们为!作为“如果”条件!

那么我哪里错了

非常感谢您的帮助!

我目前正在学习 Ruby。

【问题讨论】:

    标签: ruby methods rspec tdd call


    【解决方案1】:

    1) 你的整个draw? 方法可以简化为一行:full?(board) &amp;&amp; !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) 这里的另一个问题是您希望调用这两种方法,但如果full? 返回false,则不会调用won?。这是由于short circuiting。在所有语句必须评估为真(或假)的情况下,一旦其中一个不评估,其余的就不会评估。想一个例子:if user != nil &amp;&amp; user.admin?。您想要在此处短路,以便如果第一个语句不正确,则不会评估第二个语句。一般来说,评估输出无关紧要的语句是不必要的资源使用。

    4) 最后,一般而言,您最好测试函数的输出,而不是测试其工作原理的内部结构。最好有一堆测试,你传入数据然后expect 一个结果。

    【讨论】:

    • 我忘了短路,谢谢!这是我正在学习的在线课程的一部分,我不应该接触测试,但测试函数的输出确实更有意义! Rspec 仍然为我为井字游戏制作的整个 CLI 抛出错误,尽管它运行良好。所以我继续前进。非常感谢这些信息!
    猜你喜欢
    • 2014-12-10
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多