Rspec 3.8 перед тем, как блок не удаляет запись - PullRequest
0 голосов
/ 11 декабря 2018

В 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)>'

Теперь у меня вопрос, как мне правильно удалить это свойство ((:), так чточто мое исключение возбуждается.

1 Ответ

0 голосов
/ 11 декабря 2018

Есть более простые способы проверить это, не затрагивая базу данных.Вот как можно решить проблему с помощью заглушек:

describe '.stock' do
  before do
    allow(Property).to receive(:get).with(:amount).and_return(amount)
  end

  context 'when property amount is NOT set' do
    let(:amount) { nil }

    it 'raises an exception' do
      expect { Car.stock }.to raise_error(Exception)
    end
  end

  context 'when amount property is set' do
    let(:amount) { 10 }

    before do
      create :car_listed
      create :car_sold
    end

    it 'does NOT raise an exception' do
      expect { Car.stock }.to_not raise_error(Exception)
    end

    it 'calculates the correct amount of sellable cars' do
      expect(Car.stock).to eq(amount - 1)
    end 
  end

ПРИМЕЧАНИЕ. Я не уверен насчет последнего теста, поскольку вы не включили этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...