Подтвердить что ты не робот

Как проверить зависимые:: уничтожить с RSpec?

Я бы хотел протестировать мою ассоциацию моделей User has_many :projects, dependent: :destroy и ушел далеко вперед:

it "destroys dependent projects" do
  user = FactoryGirl.build(:user)
  project = FactoryGirl.build(:project)

  user.projects << project
  user.destroy

  expect(Project.count).to change(-1)
end

но это выдает ошибку:

Failure/Error: expect(Project.count).to change(-1)
     ArgumentError:
       `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message.

поэтому я предполагаю, что change не является правильным совпадением, не так ли? Не могли бы вы рассказать мне, как я могу написать этот тест, не получив эту ошибку?

4b9b3361

Ответ 1

Это правильный помощник, но вы не используете его правильным способом:

  • ожидать получить блок, содержащий действие для выполнения (в вашем случае удаление пользователя)
  • изменение должно получить блок, который производит числовое значение, которое ожидается изменить (он также может получить объект и символ, указывающий, что rspec должен вызывать именованный метод)

Правильный способ

expect { user.destroy }.to change { Project.count }

Это просто утверждает, что числовое значение изменяется, но не указывает, на сколько. Для этого вызовите цепочку by:

expect { user.destroy }.to change { Project.count }.by(-1)

Ответ 3

Это должно работать:

expect { user.destroy }.to change { Project.count }.by(-1)

Ответ 4

Вы должны проверить удаление фактического проекта.

expect(Project.all).not_to include project