Простой тест 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.

Другие вопросы по тегам