【问题标题】:rspec test fail - user sign out - Ruby on Rails 3 Tutorial book Chap 9rspec 测试失败 - 用户注销 - Ruby on Rails 3 教程书第 9 章
【发布时间】:2011-02-10 18:33:20
【问题描述】:

找到了一个类似的问题 (Ruby on Rails Tutorial Test Not Passing),但它的答案不适合我的问题。试图包含尽可能多的相关信息。

Rspec 错误:

失败: 1) SessionsController DELETE 'destroy' 应该让用户退出 失败/错误:controller.should_not be_signed_in 预期签到?返回假,得到真 # ./spec/controllers/sessions_controller_spec.rb:58:in `block (3 levels) in '

测试:

  describe "DELETE 'destroy'" do
    it "should sign a user out" do
      test_sign_in(Factory(:user))
      delete :destroy
      controller.should_not be_signed_in
      response.should redirect_to(root_path)
    end
  end

会话控制器:

class SessionsController < ApplicationController
  def destroy
    sign_out
    redirect_to root_path
  end

  def new
    @title = "Sign in"
  end

  def create
    user = User.authenticate(params[:session][:email],
                         params[:session][:password])

    if user.nil?
      flash.now[:error] = "Invalid email/password combination"
      @title = "Sign in"
      render 'new'
    else
      sign_in user
      redirect_to user
    end
  end

  def destroy
  end
end

会话助手

module SessionsHelper
  def sign_in(user)
    cookies.permanent.signed[:remember_token] = [user.id, user.salt]
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def sign_out
    cookies.delete(:remember_token)
    self.current_user = nil
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= user_from_remember_token
  end

  private
    def user_from_remember_token
      User.authenticate_with_salt(*remember_token)
    end

    def remember_token
      cookies.signed[:remember_token] || [nil,nil]
    end
end

感谢所有帮助。这不是我第一次在阅读这本书时遇到问题,但这是我第一次无法解决它(和其他时候一样,我确信这是我的错误 :-) )。我什至浏览了 git repo,但不确定我做了什么不同的事情。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    我成功地尝试了上述方法。我不认为服务器应该与它有任何关系,因为错误是由 rspec 生成的。

    【讨论】:

      【解决方案2】:

      所以,这里没有任何承诺,但我也看到了一些奇怪的与 rspec 相关的会话行为,当我这样做时消失了:

      耙数据库:重置
      耙分贝:迁移
      使用 ctrl-c 停止自动测试
      重启自动测试
      使用 ctrl-c 停止 rails 服务器
      用“rails s”重启rails服务器

      我没有很好的解释为什么这可能会解决问题,但它对我有用。总的来说,我对 Michael Hartl 教程的质量印象深刻。当问题出现时,它们总是是我做错事的结果。这个特殊问题,以及第 11 章中的另一个相关问题,让我认为某些意外行为可能归因于 db 的状态。我对 CH 11 问题的不良问答在这里Rails 3 Tutorial Chapter 11 "Validation failed: Email has already been taken" error

      Hartl 没有推荐将数据库带回起点的方法。以上是我的做法。可能有更好的,我很乐意看到。

      【讨论】:

      • 哎呀,我刚想更新这个。感谢您的评论。我的错误不是像我对开发那样对测试运行 rake。因此,由于两种不同的数据库架构,我得到了不同的结果。
      【解决方案3】:

      也许问题是因为您在 SessionsController 中 def destroy 两次?

      class SessionsController < ApplicationController
        def destroy
          sign_out
          redirect_to root_path
        end
      
        .
        .
        .
      
        def destroy
        end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多