0

私がテストしている以下の方法があります:

def place(arguments)
  begin 
    argument = String(arguments).split(",")
    x_coordinate = argument[0].to_i
    y_coordinate = argument[1].to_i
    direction = argument[2].downcase.to_sym
    puts "Not placed. Please provide valid arguments" unless @robot.place(x_coordinate, y_coordinate, direction)
  rescue
    raise InvalidArgument
  end
end

InvalidArgument = Class.new(Exception)

このコードでのテスト:

describe '#process' do
  it 'Process the command and place the robot' do
    expect( command.process("place 3,4,north") ).to eq(nil)
  end
end

@robotRobot クラスのインスタンス変数です。ロボット クラスはクラスを継承しActionsます。Robot クラスにはメソッドがありませんがplace、Actions クラスには次のようなものがあります。

require 'active_model'
require_relative 'board'
require_relative 'direction'
require_relative 'report'

# Contains all base action methods to support robot and other objects in future
class Actions
  include ActiveModel::Validations

  attr_accessor :x_coordinate, :y_coordinate, :direction, :placed

  validates :x_coordinate, presence: true, numericality: { only_integer: true }
  validates :y_coordinate, presence: true, numericality: { only_integer: true }

  def initialize(landscape)
    @landscape = landscape
    @map = Direction::Map.new
    self
  end

  def place(x_coordinate, y_coordinate, direction = :north)
    if within_range(x_coordinate, y_coordinate, direction)
      @placed = true
      report
    end
  end

  def within_range(x_coordinate, y_coordinate, direction)
    self.x_coordinate, self.y_coordinate, self.direction = x_coordinate, y_coordinate, direction if
    x_coordinate.between?(@landscape.left_limit, @landscape.right_limit) && 
      y_coordinate.between?(@landscape.bottom_limit, @landscape.top_limit) &&
      @map.directions.grep(direction).present?
  end

  def left
    self.direction = @map.left(self.direction)
    report
  end

  def right
    self.direction = @map.right(self.direction)
    report
  end

  def move_forward(unit = 1)
    x_coord, y_coord, direct = self.x_coordinate, self.y_coordinate, self.direction

    case direct
    when Direction::SOUTH
      place(x_coord, y_coord - unit, direct)
    when Direction::EAST
      place(x_coord + unit, y_coord, direct)
    when Direction::NORTH
      place(x_coord, y_coord + unit, direct)
    when Direction::WEST
      place(x_coord - unit, y_coord, direct)
    end
  end

  def report_current_position
    "#{@report.join(', ')}" if @report
  end

  def report
    @report = Report.new(self.x_coordinate, self.y_coordinate, self.direction).to_a 
  end

end

プロセス Rspec テスト コードでInvalidArgument、入力が正しくても例外が発生するのはなぜですか?

私は実際に CLI でコードを使用しましたが、間違いなく正常に動作しています。

4

1 に答える 1