代码之家  ›  专栏  ›  技术社区  ›  ngw

如何登录功能规范

  •  3
  • ngw  · 技术社区  · 8 年前

    我有一个使用@request的助手方法。env和designe登录用户:

    def login_user(user)
      @request.env["devise.mapping"] = Devise.mappings[:user]
      sign_in user
    end
    

    我正在尝试编写需要登录的功能规范,但login\u用户失败:

    1) Search finds a manufacturer
     Failure/Error: @request.env["devise.mapping"] = Devise.mappings[:user]
    
     NoMethodError:
       undefined method `env' for nil:NilClass
     # ./spec/support/controller_macros.rb:3:in `login_user'
     # ./spec/features/search_spec.rb:17:in `block (2 levels) in <top (required)>'
    

    我如何修复?我没有使用特性规范的经验,对于cucumber,我会使用特性登录,我肯定不确定这是RSpec的最佳实践。 提前谢谢。

    3 回复  |  直到 8 年前
        1
  •  4
  •   Sage Ross    8 年前

    在我的应用程序中的水豚功能规格中,我们使用Warden测试助手:

    # spec/rails_helper.rb
    RSpec.configure do |config|
      config.include Warden::Test::Helpers
      Warden.test_mode!
    end
    
    # in the feature spec
    login_as(user, scope: :user)
    

    此外,对于控制器规格:

    allow(controller).to receive(:current_user).and_return(user)
    
        2
  •  2
  •   Dorian    5 年前

    我当时正在与不同的图书馆合作,但它应该是可行的。这是一个非常简单的模拟:

    allow_any_instance_of(ApplicationController).to receive(:current_user) { user }
    

    您可以通过制作一个特殊助手使其更加简单:

    # spec/support/feature_spec_helper.rb`
    
    module FeatureSpecHelper
      def login(user)
        allow_any_instance_of(ApplicationController).to receive(:current_user) { user }
      end
    end
    

    然后在spec config(spec\u helper或rails\u helper)中的任意位置

    Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
    # (...)
    RSpec.configure do |config|
      config.include FeatureSpecHelper, :type => :feature
    # (...)
    

    接下来,您可以在要素等级库中使用 login user

        3
  •  1
  •   Ruff9    8 年前

    您还可以使用Capybara连接您的测试用户。在my rails\u helper中,我有以下方法:

    def create_user_and_log_in
      create :user, email: 'user@test.com', password: 'password'
      visit new_user_session_path
      fill_in :user_email, with: 'user@test.com'
      fill_in :user_password, with: 'password'
      click_on 'Connexion'
    end
    

    然后可以在规范中调用此方法。