В app/models/car.rb
метод класса stock
выглядит частично так:
def self.stock
raise Exception, "Property amount not set" if Property.get(:amount).nil?
...
end
Это свойство доступно пользователю через все операции CRUD.Теперь я хочу проверить, что если это свойство действительно удалено, должно быть выброшено стандартное ожидание.Поэтому я создал в своей модели rspec следующую группу примеров
describe '.stock' do
describe 'if property is not set' do
before(:all) {Property.where(name: 'amount').map(&:destroy)}
it 'raises an exception' do
expect{Car.stock}.to raise_error (Exception)
end
after (:all) {Property.create! name: 'amount', value: 10}
end
describe 'if property is set' do
before (:all) do
create :car_listed
create :car_sold
end
it 'calculates the correct amount of sellable cars' do
amount = 10 - Car.where(state: "sold")
expect(Car.stock).to eq(amount)
end
end
end
. Я удостоверяюсь, что все свойства с этим именем будут удалены.В этом блоке я ожидаю, что исключение будет выброшено.После it-блока я снова создал свойство, потому что от него зависят другие тесты.
В приложении есть свойства, которые не будут меняться во время тестов.Так что database_cleaner
не усекает таблицу свойств.Он был установлен через начальный файл.
config.before(:suite) do
DatabaseCleaner.strategy = :truncation, {except: %w[properties]}
end
Однако проверка не удалась с
Car
.stock
if property is set
calculates the correct amount of sellable cars
if property is not set
raises an exception (FAILED - 1)
Failures:
1) Car.stock if property is not set not set raises an exception
Failure/Error: expect{Car.stock}.to raise_error (Exception)
expected Exception but nothing was raised
# ./spec/models/car_spec.rb: `block (4 levels) in <top (required)>'
Теперь у меня вопрос, как мне правильно удалить это свойство ((:), так чточто мое исключение возбуждается.