Ruby ActiveModel不会引发错误

时间:2013-08-18 18:49:02

标签: ruby rspec activemodel

我正在尝试使用R-Spec进行单元测试时出错,但这不起作用。

我在下面的代码中使用活动模型来验证最大值和最小值,如下所示:

require 'active_model'

class Board < Struct.new(:width, :height)
    include ActiveModel::Validations

    attr_reader :top_limit, :bottom_limit, :left_limit, :right_limit

    validate :top_limit,    presense:true, numerically: {only_integer: true, :less_than => 6}
    validate :bottom_limit, presense:true, numerically: {only_integer: true, :greater_than => 0}
    validate :left_limit,   presense:true, numerically: {only_integer: true, :greater_than => 0}
    validate :right_limit,  presense:true, numerically: {only_integer: true, :less_than => 6}

    def place(x, y)

    end

end

以下测试:

require_relative '../spec_helper'
require 'board'

describe Board do

    before do
        @board = Board.new
    end

    describe 'initialise' do

        it 'should not exceed top limit' do
            @board.place(1, 6).should raise_error
        end

        it 'should not exceed bottom limit' do
            @board.place(1, 0).should raise_error
        end

        it 'should not exceed right limit' do
            @board.place(6, 1).should raise_error
        end

        it 'should not exceed left limit' do
            @board.place(0, 1).should raise_error
        end

        it 'should place robot within its limits' do
            @board.place(1, 1).should_not raise_error
        end

    end

end

如何使用Active Model验证@board.place的输入?

2 个答案:

答案 0 :(得分:1)

您需要以某种方式致电valid?。现在基本上,您的测试只是实例化Board并调用place方法。

您可以在规范中执行以下操作:

let(:instance) { Board.new }

it { expect(instance.valid?).to be_false }

此外,您的验证错误:

validates :top_limit, presence: true, numericality: { only_integer: true, less_than: 6 }
        ^                   ^         ^^^^^^^^^^^^  

答案 1 :(得分:0)

numerically应该是numericality

此外,您实际上并未在任何地方进行验证,您刚刚宣布了验证。

如果您希望place方法引发错误并通过测试,则需要在其中添加一些代码。如果这就是您的问题的真实含义,请发布您尝试过的不起作用的内容。