正数的简单Rspec测试不会通过

时间:2011-04-20 21:52:55

标签: ruby-on-rails

我是rails的新手并试图编写我的第一个应用程序。我有一个表order_size列:整数和价格:十进制(8,5)。价格栏保持货币价格,所以它需要非常精确,万一你想知道。我正在尝试编写测试以确保价格和order_size是正数,但无论我做什么他们都不会通过。

以下是Rspec测试

it "should require a positive order size" do
  @attr[:order_size] = -23
  @user.orders.create!(@attr).should_not be_valid
end

it "should require a positive price" do
  @attr[:price] = -1.2908
  @user.orders.create!(@attr).should_not be_valid
end

以下是订单类验证

  validates_presence_of :user_id
  validates_numericality_of :order_size, :greater_than => 0,
                            :only_integer => true
  validates_numericality_of :price, :greater_than => 0

这是测试结果

Failures:

  1) Order validations should require a positive order size
     Failure/Error: @user.orders.create!(@attr).should_not be_valid
     ActiveRecord::RecordInvalid:
       Validation failed: Order size must be greater than 0
     # ./spec/models/order_spec.rb:39:in `block (3 levels) in <top (required)>'

  2) Order validations should require a positive price
     Failure/Error: @user.orders.create!(@attr).should_not be_valid
     ActiveRecord::RecordInvalid:
       Validation failed: Price must be greater than 0
     # ./spec/models/order_spec.rb:44:in `block (3 levels) in <top (required)>'

这到底发生了什么?我甚至尝试运行测试断言他们应该是__有效,但他们仍然失败。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

在我看来,由于您的验证,记录的创建失败了,因此永远不会得到您的断言!正如apneadiving指出的那样,你想做:

order = Order.new(:order_size => -23)
order.should_not be_valid

答案 1 :(得分:0)

为什么打电话给create!只需致电new

或者更改您的测试以期望创建失败。

答案 2 :(得分:0)

有几种方法可以编写此测试。您正在使用create!方法,该方法会在失败时引发异常。因此,在这种情况下,您可以按如下方式编写测试:

it "should require a positive order size" do
  @attr[:order_size] = -23
  expect { @user.orders.create!(@attr)}.to raise_error(ActiveRecord::RecordInvalid.new)
end

但实际上,当create!无效时order确实引发异常的事实是特定于rails的,所以我实际上会按照@mharper的建议测试它。