rspec测试失败 - 用户注销 - Ruby on Rails 3教程书第9章

时间:2011-02-10 18:33:21

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

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

Rspec错误:

  

失败:     1)SessionsController DELETE'destroy'应该签出一个用户        失败/错误:controller.should_not be_signed_in        期望signed_in?返回虚假,得到了真实        './spec/controllers/sessions_controller_spec.rb:58:in'块(3级)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

SessionsController:

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

Sessions Helper

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,但我不确定我能做些什么不同的事情。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

rake db:reset
rake db:迁移
使用ctrl-c停止自动测试 重启autotest
使用ctrl-c停止rails服务器 使用“rails s”重新启动rails服务器

我没有一个很好的解释为什么这可能解决问题,但它对我来说。一般来说,我对Michael Hartl教程的质量印象非常深刻。当问题出现时,他们总是我做错事的结果。这个特殊问题,另一个与CH 11中的问题有关,让我觉得一些意想不到的行为可能归因于db的状态。我在CH 11问题上形成错误的Q&amp; A Rails 3 Tutorial Chapter 11 "Validation failed: Email has already been taken" error

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

答案 2 :(得分:0)

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

class SessionsController < ApplicationController
  def destroy
    sign_out
    redirect_to root_path
  end

  .
  .
  .

  def destroy
  end
相关问题