ruby - 如何为一种方法编写 rspec 测试

标签 ruby rspec

我将此方法作为更大类的一部分。我正在尝试为其编写测试,但我是 rspec 的新手,我有点难过......如果我在 9.times 循环中注释掉所有内容,我可以测试“drawgrid”。但如果我取消注释该代码,则当前测试失败。我需要测试 play 方法...运行游戏。它放置'drawgrid'......运行游戏序列9次,在每轮之后放置'drawgrid'。但我不确定该怎么做。非常感谢任何指点。

下面是播放方法和当前规范

      def play
        #draw the board
        puts drawgrid

        #make a move
        turn = 0

        9.times do

          if turn.even?

            @player = @player_h.move_human("X", @board)

            @move = @player.to_sym
            @marker = @player_h.boardpiece

            does_move_exist(@move,@marker)
            is_a_human_win(@board)

          else

            @player = @player_c.move_computer("O", @board)

            @move = @player
            @marker = @player_c.boardpiece

            does_move_exist(@move,@marker)
            is_a_computer_win(@board)

          end

          puts drawgrid

          turn += 1
        end # 9.times ends
      end

当前规范....

      describe 'play method' do
        it 'draws the game grid' do
          @player_human = Player.new('X')
          @player_computer = Player.new('O')
          @board = Board.new
          @game = Game.new(@player_human, @player_computer, @board)

          @game.should_receive(:puts).with("\na  | |  \n----------\nb  | |  \n----------\nc  | |  \n----------\n  1 2 3\n")

          @game.play
        end
      end
      describe '9.times' do
        it 'runs game sequence 9 times...once per board spot' do
          @player_human2 = Player.new('X')
          @player_computer2 = Player.new('O')
          @board2 = Board.new
          @game2 = Game.new(@player_human2, @player_computer2, @board2)

          turn = 0       
          9.times do
            if turn.even?
              @player_human2.should_receive(:puts).with("human move...")
              @player_human2.stub(:gets).and_return("b2")
            else
              @player_human2.should_receive(:puts).with("computer move...")
              @player_human2.stub(:gets).and_return("a1")
            end
            turn += 1
          end
        @game2.play
        end
      end

最佳答案

总的来说,我觉得您的代码和测试都试图在一种方法中做太多事情。关于您的 play 方法的有趣之处与其说是 9 次,不如说是该循环内部发生的事情。我对重构的第一个建议是将该循环内部的内容转换为名为“take_turn”或类似名称的方法。

然后您可以为单个回合发生的情况编写规范。而且,您对 play 方法的规范将测试 take_turn 方法被调用了 9 次。

这并不是说您不能保持代码原样并为其编写有效的测试……您只是不能对您正在测试的内容进行 super 外科手术。

希望对您有所帮助。

关于ruby - 如何为一种方法编写 rspec 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963214/

相关文章:

ruby-on-rails - 如何在线程或子进程中运行和停止 delayed_jobs worker 以进行测试

如果源中有 "+"字符,ruby 正则表达式不匹配字符串

ruby - Rspec 不告诉我它的

ruby - 如何使用 rspec 模拟模块内的类方法

ruby-on-rails - RVM ruby​​ 安装失败

ruby - `<main>' : uninitialized constant Rabbit (NameError)

ruby-on-rails - 在 Rails 环境之外测试(使用 RSpec) Controller

ruby-on-rails - 多线程并发 Capybara 请求?

ruby - MacVim 命令窗口文本着色帮助(Rspec 输出)

ruby-on-rails - 带有标题 : true 的 rspec stub CSV Foreach