вопросы тестирования интеграции рельсов - PullRequest
4 голосов
/ 28 марта 2012

Я пытаюсь провести интеграционное тестирование, используя собственную систему тестирования Rails, на пользовательской модели, как показано в руководстве по rails.

В rout.rb я сделал следующее отображение:

match '/signup',  to: 'users#new'

Тест выглядит так:

class UserStoriesTest < ActionDispatch::IntegrationTest
  test "sign up" do
    User.delete_all
    post_via_redirect "/users",  
           user: {name: 'david', 
                  email: 'david@example.com', 
                  password: 'qwe123', 
                  password_confirmation: 'qwe123'}
    assert_response :success
    users = User.all
    assert_equal 1, users.size, users.size   
  end
end

Независимо от того, что я делаю, я не могу заставить его создать новую запись, поэтому второе утверждение не выполнено. Я также попытался преднамеренно ошибиться, установив неверный пароль подтверждения, и он не потерпел неудачу при первом утверждении. Я пробовал только отправлять вместо post_via_redirect или использовать путь "signup" вместо "/ users", без изменений.

Я, конечно, делаю что-то глупое. Что мне здесь не хватает?

Привет.

Ответы [ 2 ]

0 голосов
/ 20 марта 2013

Этот ответ, вероятно, слишком стар, чтобы быть полезным для вас, но несколько вещей выделяются для меня.

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

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 28 марта 2012

Вы на самом деле не заполняете форму регистрации. Похоже, вы используете test :: unit, что вам нужно, это webrat или capybara для обработки спецификаций запроса, я рекомендую последний.

https://github.com/jnicklas/capybara

https://github.com/brynary/webrat

...