Почему NoMethodError, например, метод другого класса в Rspec? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть класс Player в player.rb

class Player
  attr_reader :name, :symbol
  ...
  def make_move?(position, board)
    if board.move_valid?(position)
        board.update(position, symbol)
        return true
    else
        return false
    end
  end 
  ...
end

board.move_valid? и другие методы платы определены в файле для класса Board, board.rb

class Board
...
  def move_valid?(position)
    correct_pos = ("1".."9").include?(move)
    if correct_pos
      is_not_occupied = pos[move.to_i - 1].eql?(move)
    end
    correct_pos and is_not_occupied
  end

  def update(p, s)
  ...
  end
...
end

Оба файла классов находятся в папке lib.

При запуске команды rspec из корневого каталога проекта я получаю ошибку :

Player
  #make_move?
    marks a valid spot on the board (FAILED - 1)

Failures:

  1) Player#make_move? marks a valid spot on the board
     Failure/Error: if board.move_valid?(position)

     NoMethodError:
       undefined method `move_valid?' for "3":String
     # ./lib/player.rb:12:in `make_move?'
     # ./spec/player_spec.rb:9:in `block (3 levels) in <top (required)>'

Finished in 0.0032 seconds (files took 0.11769 seconds to load)
16 examples, 1 failure

Failed examples:

rspec ./spec/player_spec.rb:6 # Player#make_move? marks a valid spot on the board

Соответствующее содержимое файла теста rspec:

require './lib/player'
require './lib/board'

describe Player do
    describe "#make_move?" do
        it "marks a valid spot on the board" do
            player = Player.new("Abc", "X")
            board = Board.new
            expect(player.make_move?(board, "3")).to eql(true)
        end
    end
end

Проект включает в себя файл main.rb в папке bin, который require содержит определения классов и работает.

1 Ответ

4 голосов
/ 21 июня 2019

Это происходит из-за порядка переменных, которые вы передаете в make_move.

make_move принимает position с последующим board.Ошибка утверждает, что move_valid является строкой, а не экземпляром Board.

В этой строке параметры должны поменяться местами, как показано:

expect(player.make_move?("3", board)).to eql(true) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...