Этот ответ, вероятно, слишком стар, чтобы быть полезным для вас, но несколько вещей выделяются для меня.
1) Это не должно быть интеграционным тестом, поскольку вы не тестируете взаимодействие между несколькими контроллерами. Это должен быть функциональный тест, который используется для тестирования отдельных контроллеров, в данном случае, вашего UsersController. Это важно, так как различные методы и функции доступны / загружены в зависимости от вашего объявления.
class UserStoriesTest < ActionDispatch::IntegrationTest
Даст вам совершенно другую среду, чем
class UserTest < ActiveSupport::TestCase
Обратите внимание, что интеграционный тест является частью ActionDispatch, а функциональный тест является частью ActiveSupport. Я настоятельно рекомендую перенести это в функциональный тест, и это, вероятно, источник ваших ошибок.
2) Использование delete_all немного экстремально. На самом деле, вы можете просто выполнить проверку утверждения, когда будете писать, чтобы увидеть, есть ли разница в количестве.
assert_difference('User.count') do
post :create, :user => {name: 'david',
email: 'david@example.com',
password: 'qwe123',
password_confirmation: 'qwe123'}
end
Это приведет к тому, что User.count будет отличаться от того, что вы использовали до запуска того, что находится в цикле do, и после его завершения. Этот блок может заменить все, что у вас есть в тесте «зарегистрироваться». Для забавы вы можете изменить assert_difference на assert_no_difference, и если это пройдет, вы знаете, что что-то не так с вашим методом post в вашем users_controller.rb (именно здесь я предполагаю, что ваша проблема на самом деле лежит).
3) Ваша строка assert_equal выглядит немного странно. Последний переданный аргумент - это сообщение, которое он выдаст при неудаче. Распечатка только числа может работать для одного теста, но будет выглядеть очень странно во многих тестах. Что-то вроде следующего, я считаю, ближе к нормам:
assert_equal 1, User.count, "Expected User.count to be equal to 1, instead it is equal to: " + User.count.to_s
Также обратите внимание, что вы можете просто использовать ModelName.count вместо того, чтобы делать что-то вроде помещения всех записей в объект, а затем вызывать размер этого объекта. Это может стать очень грязным, очень быстро.
Наконец, как общий инструмент отладки, вы можете разбрасывать операторы put или logger повсюду, чтобы увидеть, что на самом деле происходит.
puts User.count
После того, как ваш delete_all и ваш post_via_redirect очень быстро сообщат вам, что и где не так. если вы используете метод logger, он будет записан в журнал в вашем appname / log / ENV.log. Так что, если вы запускаете тесты, это будет в test.log.
logger.debug User.count
В ваших журналах также будут храниться записи обо всех запросах, поэтому вы можете прочитать и посмотреть, получаете ли вы 200 OK, 302 перенаправления и т. Д.
Предлагаю ознакомиться со следующими руководствами, предоставленными рельсами, они являются отличными отправными точками:
http://guides.rubyonrails.org/testing.html
http://guides.rubyonrails.org/debugging_rails_applications.html
Надеюсь, это кому-нибудь поможет!