在ActionDispatch :: IntegrationTest中使用log_in_as帮助程序模块

时间:2016-05-11 20:57:25

标签: ruby-on-rails-4 integration-testing

我开始使用Michael Hartl" Ruby on Rails Tutorial"来开始学习Rails,然后我开始定制一些类以满足我自己的需要。 目前,我有两个可以使用我的应用程序管理的主要类:

  • "用户":管理员用户可以列出,创建销毁他们
  • " apps":管理员可以列出,创建销毁它们

我从教程中回收了大部分内容,并设法使应用程序适用于它们。

"用户"集成测试工作正常。 当开始开发" apps"测试,我发现有些东西会导致登录失败,我真的很痴迷于此。 这是"用户"集成测试(可行):

require 'test_helper'
class UsersCreateTest < ActionDispatch::IntegrationTest
  fixtures :all
  def setup
    @admin = users(:admin)
  end

  test "user create with valid information" do
    log_in_as(@admin)
    assert is_logged_in?
    get new_user_path()
    ...
    assert_difference 'User.count', 1 do
      post users_path, user:{ username:  "newuser",
                              email: "user@example.com",
                              password:              "pippo1",
                              password_confirmation: "pippo1",
                              ...
      }
      follow_redirect!
    end
    ...
  end

end

以下是创建新应用程序&#34;的测试。 (不起作用):

require 'test_helper'

class AppsCreateTest < ActionDispatch::IntegrationTest
  fixtures :all

  def setup
    @admin= users(:admin)
    @app= apps(:app1)
  end

  test "create app with valid information" do
    log_in_as(@admin)
    assert is_logged_in?
    get new_app_path()
    ...
    assert_difference( 'App.count', 1) do
      post apps_path, app: { appname:  "newapp",
                              desc: "short descprition here",
                              ...
      }
      follow_redirect!
    end
  end
end

最后,这是&#34; test_helper.rb&#34;部分,直接来自Hartl教程:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  def is_logged_in?
      !session[:user_id].nil?
  end

   # Logs in a test user.
   def log_in_as(user, options = {})
      password= options[:password] || 'pippo1'

    if integration_test?
      post "/login", session: {
        username:   user.username,
        password:   password }
    else
      session[:user_id] = user.id
    end
  end

  private
    # Returns true inside an integration test.
    def integration_test?
      defined?(post_via_redirect)
    end
end

&#34; app&#34;尝试在&#34; log_in_as&#34;中进行后期操作时测试失败。 似乎&#34;用户&#34;测试继承了某些方法,而#34; app&#34;测试没有。 任何建议都表示赞赏。

0 个答案:

没有答案