Интеграционный тест Rails с жемчужиной разработки - PullRequest
6 голосов
/ 27 ноября 2010

Я хочу написать тест интеграции рельсов (с ActionDispatch::IntegrationTest).Я использую устройство для аутентификации и машинист для тестовых моделей.Я не могу выполнить вход1010 *

require 'machinist/active_record'
require 'sham'

User.blueprint do
  email {"foo@bar.com"}
  password {"qwerty"}
end

Ответы [ 5 ]

10 голосов
/ 08 мая 2013

Причина, по которой это не работает, заключается в том, что devise создает имена полей формы как

'user[email]'
'user[password]'

, а post_via_redirect ожидает эти имена в качестве аргументов.Таким образом, следующее заявление приведет к успешному входу в систему.

post_via_redirect 'users/sign_in', 'user[email]' => 'foo@bar.com', 'user[password]' => 'qwerty' 
8 голосов
/ 03 декабря 2010

Прежде всего, при разработке, вам, возможно, придется «подтвердить» пользователя.

вы можете сделать что-то вроде этого:

user = User.make!
user.confirmed_at = Time.now
user.save!

Вот пример без Machinist (но вам просто нужно заменить часть кода создания пользователя на часть выше):

в test_integration_helper:

require "test_helper"
require "capybara/rails"

    module ActionController
      class IntegrationTest
        include Capybara

        def sign_in_as(user, password)
           user = User.create(:password => password, :password_confirmation => password, :email => user)
           user.confirmed_at = Time.now 
           user.save!
           visit '/'
           click_link_or_button('Log in')
           fill_in 'Email', :with => user.email
           fill_in 'Password', :with => password
           click_link_or_button('Sign in')
           user      
         end 
         def sign_out
            click_link_or_button('Log Out')   
         end
      end
    end

И в ваш интеграционный тест:

require 'test_integration_helper'

class UsersIntegrationTest < ActionController::IntegrationTest

  test "sign in and then sign out" do 
    #this helper method is into the test_integration_helper file                   
    sign_in_as("lolz@gmail.com", "monkey")         
    assert page.has_content?('Signed in successfully'), "Signed in successfully"

    sign_out         
    assert page.has_content?('Signed out successfully'), "Signed out successfully" 
  end
end
2 голосов
/ 03 декабря 2010

У меня нет примера интеграционного теста в книге для Devise, но я думаю, что код в определении шага в главе Огурец также будет работать, если у вас установлен Webrat / Capybara:

@user = User.create!(:email => "email@email.com",  
            :password => "password",  
            :password_confirmation => "password")
visit "login"  
fill_in("user_email", :with => @user.email)  
fill_in("user_password", :with => "password") 
click_button("Sign In")
1 голос
/ 29 августа 2012

В случае, если у кого-то еще есть подобная проблема ...

Я был в аналогичной ситуации (мигрировал из Authlogic), и у меня была точно такая же проблема. Проблема была в инициализаторе devise.rb. По умолчанию он настраивает вашу тестовую среду на использование только одного отрезка во время шифрования / дешифрования паролей. Честно говоря, я не знаю, что такое отрезок, но для того, чтобы Devise работал со старыми зашифрованными паролями Authlogic, отрезки должны быть равны 20. Так как я пытался войти в систему, у пользователя которого изначально был зашифрован пароль Authlogic в моем тесте Devise также должен использовать 20 тестов. Я изменил конфиг, как показано ниже:

# Limiting the stretches to just one in testing will increase the performance of
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
# a value less than 10 in other environments.
-  config.stretches = Rails.env.test? ? 1 : 20
+  config.stretches = 20
0 голосов
/ 19 октября 2018

Поскольку вы используете ActionDispatch::IntegrationTest, вы можете включить модуль Devise::Test::IntegrationHelpers и использовать вместо него метод sign_in (к которому можно передать пользователя):

class UserFlowsTest < ActionDispatch::IntegrationTest
  include Devise::Test::IntegrationHelpers

  test "sign in to the site" do
    sign_in users(:one)
  end
end
...