我是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)>'
这到底发生了什么?我甚至尝试运行测试断言他们应该是__有效,但他们仍然失败。任何帮助将不胜感激。
答案 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的建议测试它。