【问题标题】:Hartl Rails Tutorial - Having issue with undefined method 'sign_in' during testsHartl Rails 教程 - 在测试期间遇到未定义方法“sign_in”的问题
【发布时间】:2014-02-15 21:51:01
【问题描述】:

所以我正在运行 Michael Hartl Rails 教程,并且在创建编辑页面后(清单 9.3 结尾),我在运行测试时收到以下错误。据我所知,我定义了 sign_in 方法并使其在我的应用程序控制器中可用。不完全确定我哪里出错了,因为他的教程说我的测试应该通过这一点。任何帮助表示赞赏。 (另外,如果我需要包含其他内容,请告诉我)

失败:

1) 用户页面编辑页面 失败/错误:登录用户 无方法错误: '

中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108a92118> # ./spec/requests/user_pages_spec.rb:60:inblock(3 级)

2) 用户页面编辑页面 失败/错误:登录用户 无方法错误: '

中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108820560> # ./spec/requests/user_pages_spec.rb:60:inblock(3 级)

3) 用户页面编辑页面 失败/错误:登录用户 无方法错误: '

中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108846be8> # ./spec/requests/user_pages_spec.rb:60:inblock(3 级)

4) 使用无效信息编辑用户页面 失败/错误:登录用户 无方法错误: '

中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_2:0x00000103e6cd60> # ./spec/requests/user_pages_spec.rb:60:inblock(3 级)

在 0.98841 秒内完成 23 个例子,4 个失败

测试文档:user_pages_spec.rb

require 'spec_helper'

    describe "User pages" do

    subject { page }
    .
    .
    .

    describe "edit" do
        let(:user) { FactoryGirl.create(:user) }
        before do
            sign_in user
            visit edit_user_path(user)
        end

        describe "page" do
            it { should have_content("Update your profile") }
            it { should have_title("Edit user") }
            it { should have_link('change', href: 'http://gravatar.com/emails') }
        end

        describe "with invalid information" do
            before { click_button "Save changes" }

            it { should have_content('error') }
        end
    end
end

会话助手:sessions_helper.rb

module SessionsHelper

    def sign_in(user)
        remember_token = User.new_remember_token
        cookies.permanent[:remember_token] = remember_token
        user.update_attribute(:remember_token, User.encrypt(remember_token))
        self.current_user = user
    end

    def signed_in?
        !current_user.nil?
    end

    def current_user=(user)
        @current_user = user
    end

    def current_user
        remember_token = User.encrypt(cookies[:remember_token])
        @current_user ||= User.find_by(remember_token: remember_token)
    end

    def sign_out
        current_user.update_attribute(:remember_token,
                                      User.encrypt(User.new_remember_token))
        cookies.delete(:remember_token)
        self.current_user = nil
    end
end

应用控制器:application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  include SessionsHelper
end

【问题讨论】:

  • 只是为了确认...您指的是来自本网站 (ruby.railstutorial.org) 的教程?
  • 已确认。尽管 Richard Johnson 成功地教会了我解决方案。

标签: ruby-on-rails-4 railstutorial.org


【解决方案1】:

这告诉你 sign_in 不是测试范围内的方法,所以你不能像这样在 before 块中使用它。这是一种控制器方法而不是测试方法。

最简单的方法是创建一个用于登录的规范助手方法,您可以在 before 块的上下文中调用该方法,该块为任何需要登录用户的测试设置状态。

这样做的一种方法是我有一个“user_signs_in”助手,它使用水豚访问登录路径,在登录表单中填写正确的详细信息,然后遵循重定向。

相关stackoverflow q:

How do I simulate a login with RSpec?

【讨论】:

  • 谢谢。在教程中进一步检查后,我注意到他确实做了类似的事情,所以我一定是错过了这个教训。我确实很欣赏这个解释,因为我现在实际上理解得更好了。谢谢。
猜你喜欢
  • 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
相关资源
最近更新 更多