首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Sorcery和RSpec测试身份验证

用Sorcery和RSpec测试身份验证
EN

Stack Overflow用户
提问于 2014-01-01 21:03:35
回答 4查看 2.5K关注 0票数 1

在寻求帮助之前,我花了很长时间处理这件事。我似乎不能让RSpec和巫术一起玩得很好。我已经阅读了与巫术的集成测试上的文档,可以正确地发布登录操作,但是我的测试仍然认为用户没有登录。

代码语言:javascript
复制
# spec/controllers/user_controller_spec
describe 'user access' do
    let (:user) { create(:user) }

    before :each do
      login_user(user[:email], user[:password])
    end

    it "should log in the user" do
      controller.should be_logged_in
    end

end

和我的login_user方法

代码语言:javascript
复制
# spec/support/sorcery_login
module Sorcery
  module TestHelpers
    module Rails
      def login_user email, password
        page.driver.post(sessions_path, { email: email , password: password, remember_me: false })
      end
    end
  end
end

当我在生成的页面上使用这些页面时,会话控制器会正确地处理它们。我尝试输出login_user方法的结果,它似乎正确地发布了数据。如何通过测试持久化这个登录用户?以前是这样的吗:每个街区都不适用于此吗?我只是不知道它可能在哪里出错,而且我对测试/RSpec非常陌生,所以我可能遗漏了一些显而易见的东西。我很感谢你的帮助。

下面是失败测试的输出:

代码语言:javascript
复制
1) UsersController user access should log in the user
    Failure/Error: controller.should be_logged_in
    expected logged_in? to return true, got false
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-01 22:00:19

我昨天刚经历过这个。这就是我所做的,如果有帮助的话。

魔法师提供了一个测试助手login_user,它依赖于可用的@controller对象。这在控制器规范中非常有用,但在集成测试中却不起作用。因此,集成测试的解决方法是编写另一个方法(如上面的方法),以模拟通过HTTP请求(实质上模拟提交表单)登录。

因此,我的第一个想法是,您应该尝试将您的方法重命名为login_user_post或其他不会与内置测试助手发生冲突的东西。

另一个潜在的问题是,在我看来,巫术助手认为您的用户密码是“秘密”。

这里有一个指向内置助手的链接,这样您就可以看到我在说什么:

助理员/铁路

祝你好运,除了这部分,我真的很喜欢这个宝石。这真的是完全解释了修补这样的帖子。下面是我使用的代码:

集成助手

代码语言:javascript
复制
module Sorcery
  module TestHelpers
    module Rails
      def login_user_post(user, password)
        page.driver.post(sessions_url, { username: user, password: password}) 
      end

      def logout_user_get
        page.driver.get(logout_url)
      end
    end
  end
end

Integration (用户需要登录才能进行操作)

代码语言:javascript
复制
  before(:each) do
    @user = create(:user)
    login_user_post(@user.username, 'secret')
  end

Controller (普通login_user助手工作正常)

代码语言:javascript
复制
  before(:each) do
    @user = create(:user)
    login_user
  end

注意,如果您有一个密码为“login_user”的@user对象,则不需要任何参数。

票数 1
EN

Stack Overflow用户

发布于 2014-05-02 15:51:21

你有没有尝试添加到spec/spec_helpers中。

代码语言:javascript
复制
RSpec.configure do |config|
  # ...
  config.include Sorcery::TestHelpers::Rails::Controller
end

您需要包含Sorcery::TestHelpers::Rails::Controller,而不仅仅是Sorcery::TestHelpers::Rails

然后,您将能够从任何控制器规范中获得login_user,如:

代码语言:javascript
复制
describe CategoriesController do

  before do
    @user = FactoryGirl::create(:user)
  end

  describe "GET 'index'" do
    it "returns http success" do
      login_user
      get 'index'
      expect(response).to be_success
    end
  end
end
票数 1
EN

Stack Overflow用户

发布于 2014-01-01 22:03:26

您传递密码的方式可能是错误的。在这一点上可能是加密的。在提供的示例中,我首先尝试这样做:

代码语言:javascript
复制
describe 'user access' do
    let (:user) { create(:user, password: 'secret') }

    before :each do
      login_user(user[:email], 'secret')
    end

    it "should log in the user" do
      controller.should be_logged_in
    end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20873246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档