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メソッド呼び出しの結果ではなく、プレーヤーオブジェクトで発生する「gets」呼び出しをスタブ化する必要があります。

したがって、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)

お役に立てば幸いです。

于 2012-09-23T01:30:46.443 に答える
1

クラスのメソッドをスタブ化できます。

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