Я установил функцию мягкого удаления (без использования драгоценного камня Paranoia): пользователь может быть удален программным способом, а затем объект destroy_all навсегда удалит всех пользователей, удаленных программным способом.Он работает в разработке, но я не могу пройти тестирование.Тест запрашивает с областью, но уничтожает всех пользователей независимо.
Область в User.rb scope :only_deleted, -> { where.not(deleted_at: nil) }
находит всех удаленных пользователей.В контроллере у меня есть:
def destroy_soft_deleted
User.only_deleted.destroy_all
...
end
Я попробовал этот тест (и многие другие комбинации):
def setup
@user1 = users(:adam)
@user2 = users(:beth)
end
test "successful permanent deletion of all soft-deleted users" do
@user2.soft_delete
assert_difference "User.count", -1 do
delete destroy_soft_deleted_users_path
end
end
Все остальные тесты пройдены (например, @user.soft_delete
проверен) и приспособленияявляются хорошим.Журнал тестов показывает, что область используется, но все равно удаляет обоих пользователей:
SELECT "users".* FROM "users" WHERE ("users"."deleted_at" IS NOT NULL)
DELETE FROM "users" WHERE "users"."id" = ?[0m [["id", 585460615]]
DELETE FROM "users" WHERE "users"."id" = ?[0m [["id", 911064266]]
Вот результат теста:
"User.count" didn't change by -1.
Expected: 1
Actual: 0
Не работает ли Model.some_scope.destroy_all
в тестах?Есть ли другое утверждение, которое я должен использовать?