Как проверить зависимые:: уничтожить с 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
не является правильным совпадением, не так ли? Не могли бы вы рассказать мне, как я могу написать этот тест, не получив эту ошибку?
Ответы
Ответ 1
Это правильный помощник, но вы не используете его правильным способом:
- ожидать получить блок, содержащий действие для выполнения (в вашем случае удаление пользователя)
- изменение должно получить блок, который производит числовое значение, которое ожидается изменить (он также может получить объект и символ, указывающий, что rspec должен вызывать именованный метод)
Правильный способ
expect { user.destroy }.to change { Project.count }
Это просто утверждает, что числовое значение изменяется, но не указывает, на сколько. Для этого вызовите цепочку by
:
expect { user.destroy }.to change { Project.count }.by(-1)
Ответ 2
Вы также можете использовать сокеты-помощники:
it { expect(user).to have_many(:projects).dependent(:destroy) }
https://github.com/thoughtbot/shoulda-matchers
Ответ 3
Это должно работать:
expect { user.destroy }.to change { Project.count }.by(-1)
Ответ 4
Вы должны проверить удаление фактического проекта.
expect(Project.all).not_to include project