0

我有一个类和一个这样的方法......

class Player

  attr_reader :boardpiece # i exist so game can read me

  def initialize(letter)
    @boardpiece = letter
  end

  def move_human(game, board)
    @game_two = game

    puts "human move..."

    human_move = gets.chomp

    human_symbol = human_move.to_sym

    # look for move as key in board.grid
    if board.grid.has_key?(human_symbol)
      if board.grid[human_symbol] == " "
        #puts "bingo"  
        @move = human_symbol            
      else
        puts "spot taken...try again"
        move_human(@game_two, board)
      end
    else
      puts "invalid move...try again"
      move_human(@game_two, board)
    end 

  end
end

我正在尝试在 RSpec 中为它编写一个测试...

require 'game'
require 'board'

describe Player do
  describe 'move_human' do
    it 'receives cli input' do
      player_h = Player.new('X')
      player_c = Player.new('O')
      board = Board.new
      game = Game.new(player_h, player_c, board)          

      player_h.move_human('X', board).should_receive(:puts).with('human move...')

      game.play
    end
    xit 'and returns a move value'

  end
end

我收到此错误作为输出....我做错了什么?

gideon@thefonso ~/Documents/ca_ruby/rubytactoe (development)$ rspec spec

Board
  creates a blank board with nine spaces
  can set the value of a specified cell
  checks if a space is taken or not
  drawgrid
    draws a blank grid given no input

Player
  move_human
human move...
    receives cli input (FAILED - 1)
    and returns a move value (PENDING: Temporarily disabled with xit)

Pending:
  Player move_human and returns a move value
    # Temporarily disabled with xit
    # ./spec/player_spec.rb:16

Failures:

  1) Player move_human receives cli input
     Failure/Error: player_h.move_human('X', board).should_receive(:puts).with('human move...')
     Errno::EISDIR:
       Is a directory - spec
     # ./lib/player.rb:21:in `gets'
     # ./lib/player.rb:21:in `gets'
     # ./lib/player.rb:21:in `move_human'
     # ./spec/player_spec.rb:12:in `block (3 levels) in <top (required)>'

Finished in 0.00977 seconds
6 examples, 1 failure, 1 pending

Failed examples:

rspec ./spec/player_spec.rb:6 # Player move_human receives cli input
gideon@thefonso ~/Documents/ca_ruby/rubytactoe (development)$
4

2 回答 2

2

@thefonso,不完全是。您想要存根发生在播放器对象上的“获取”调用,而不是 move_human 方法调用的结果。

所以,你会说 player_h.stub(:gets).and_return("some input from the user")。同样的事情也适用于你的 should_receive(:puts) 位。在调用这些方法的地方发生方法调用之前,您需要设置这些期望。因此,您的规范可能具有以下内容:

# These setup expectations for when "gets" and "puts" are called later...
player_h.stub(:gets).and_return("some input from the user")
player_h.should_receive(:puts).with("human move...")

# And then we run the method where those expectations above will get triggered:
player_h.move_human('X', board)

希望有帮助。

于 2012-09-23T01:30:46.443 回答
1

您可以为您的课程存根该方法。

player_h.stub(:gets).and_return("Some string")
于 2012-09-22T22:05:04.717 回答