在子类下定义的实例返回nil和RSpec:没有从nil到整数的隐式转换

时间:2013-08-26 01:03:11

标签: ruby rspec

我在下面的代码中,在需要

之后返回了动作类

机器人类

attr_accessor :action

    def initialize 
        @action = Actions.new
    end

    def left
        @action.left
    end

现在,Action类使用{initial}方法下定义的Direction::Move.new实例。

动作类

def place(x_coordinate, y_coordinate, direction = :north)
        @x_coordinate = x_coordinate
        @y_coordinate = y_coordinate
        @direction = direction
        @report.log_position(x_coordinate, y_coordinate, direction) if

        x_coordinate.between?(@board.left_limit, @board.right_limit) && 
        y_coordinate.between?(@board.bottom_limit, @board.top_limit) &&
        @move.directions.grep(direction).present?
    end

    def left
        @move.left(direction)
    end

我现在已经使用place方法定义了Actions类,因此方向被分配到attr_accessor然后调用robot.left

describe '#left' do
        it 'should turn left' do
            action.place(0, 0, Direction::North)
            expect(robot.left).to eq(Direction::West)
        end
    end

但是当我做Rspec测试时,它会返回错误:

RSpec: no implicit conversion from nil to integer

为什么调用robot.left的{​​{1}}不允许将action.left传递给此direction方法?

1 个答案:

答案 0 :(得分:0)

我能想到的最直接的解释是,示例中引用的action变量引用的Actions实例不是robot创建的实例。如果您在Robot的关联实例上创建了place但未拨打Actions,那么当robot.left调用@action.left时,@direction将会在Actions实例中未定义,因此访问者direction将返回nil,这会导致错误。

您可以分享与specrobot定义方式相关的action文件的剩余部分吗?