这个RSpec错误告诉我什么?

时间:2012-09-22 22:02:34

标签: ruby rspec

我有一个班级和方法......

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)$

2 个答案:

答案 0 :(得分:2)

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

所以,你会说player_h.stub(:gets).and_return(“来自用户的一些输入”)。同样的事情也适用于你的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)

希望有所帮助。

答案 1 :(得分:1)

你可以为你的班级存出方法。

player_h.stub(:gets).and_return("Some string")