所以我正在运行Michael Hartl Rails教程,在创建编辑页面之后(代码清单9.3),我在运行测试时遇到以下错误。据我所知,我定义了sign_in方法并使其在我的应用程序控制器中可用。不完全确定我哪里出错,因为他的教程说我的测试应该通过这一点。任何帮助表示赞赏。 (另外,如果我需要包含其他内容,请告诉我)
故障:
1)用户页面编辑页面 失败/错误:sign_in用户 NoMethodError: '
中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108a92118> # ./spec/requests/user_pages_spec.rb:60:in
阻止(3个级别)2)用户页面编辑页面 失败/错误:sign_in用户 NoMethodError: '
中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108820560> # ./spec/requests/user_pages_spec.rb:60:in
阻止(3个级别)3)用户页面编辑页面 失败/错误:sign_in用户 NoMethodError: '
中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108846be8> # ./spec/requests/user_pages_spec.rb:60:in
阻止(3个级别)4)用无效信息编辑用户页面 失败/错误:sign_in用户 NoMethodError: '
中未定义的方法sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_2:0x00000103e6cd60> # ./spec/requests/user_pages_spec.rb:60:in
阻止(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
答案 0 :(得分:0)
这告诉你sign_in不是测试范围内的方法,因此你不能在之前的块中使用它。它是一种控制器方法,而不是一种测试方法。
最简单的方法是创建一个进行登录的规范帮助方法,您可以在before块的上下文中调用该方法,该模块为需要登录用户的任何测试设置状态。
执行此操作的一种方法是使用“user_signs_in”帮助程序,使用capybara访问登录路径,使用正确的详细信息填写表单,然后按照重定向进行操作。
相关的stackoverflow q: