Простой тест Rspec для положительного числа просто не пройдет
Я новичок в рельсах и пытаюсь написать свое первое приложение. У меня есть таблица с колонками order_size:integer и price:decimal(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)>'
Что именно здесь происходит? Я даже попытался запустить тест, утверждая, что они должны быть be_valid, но они все равно не работают. Любая помощь будет оценена.
3 ответа
Мне кажется, что создание записей не удается из-за ваших проверок, и, следовательно, никогда не получить ваше утверждение! Как указывает аппендиат, вы хотите сделать:
order = Order.new(:order_size => -23)
order.should_not be_valid
Зачем звонишь create!
просто позвони new
Или измените свой тест, чтобы ожидать, что создание потерпит неудачу.
Есть несколько способов написать этот тест. Вы используете 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
не действителен, специфичен для рельсов, так что я бы на самом деле протестировал его, как предложено @mharper.