首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >意外的Capybara警告- Rails教程第9章练习9

意外的Capybara警告- Rails教程第9章练习9
EN

Stack Overflow用户
提问于 2013-09-07 00:51:28
回答 1查看 449关注 0票数 1

我在和Harlt的第9章练习9搏斗。

当我为这个练习设计我的测试时,:no_capybara设置为true,就像本教程的其他部分一样,测试通过了,但是我得到了以下警告:

代码语言:javascript
运行
复制
WARNING: ignoring the provided expectation message argument (true) since it is not a string.

这个版本的测试如下:

*规范/请求/身份验证_pages_spec.rb*

代码语言:javascript
运行
复制
describe "as an admin user" do 
   let(:admin) {FactoryGirl.create(:admin)}
   before do  
     sign_in(admin, :no_capybara => true)
   end

   describe "should not be able to delete itself by direclty submitting request" do 
     before { delete user_path(admin) }
     specify { response.should redirect_to(users_path), 
                flash[:error].should =~ /Can't delete own admin account/i }
   end
 end

注意,在本教程的其他空间中,Hartl是如何使用该方法的,如下所示:

*规范/请求/身份验证_pages_spec.rb*

代码语言:javascript
运行
复制
describe 'signed in user' do 
      let(:user) { FactoryGirl.create(:user) }
      before { sign_in user, no_capybara: true }

      describe 'unable to access now' do  
        before {get new_user_path}
        specify { expect(response).to redirect_to(root_url)}
      end
.
.
.ect...

但是,当我不设置:no_capybara时,我的测试失败:

代码语言:javascript
运行
复制
describe "as an admin user" do 
  let(:admin) {FactoryGirl.create(:admin)}
  before { sign_in(admin) } 
  .
  .
  .
Failures: 

  1) Authentication authorization as a non-admin user submitting a DELETE request to the     Users#destroy action 
     Failure/Error: before { delete user_path(user)}
     NoMethodError:
       undefined method `admin?' for nil:NilClass
     # ./app/controllers/users_controller.rb:68:in `admin_user'
     # ./spec/requests/authentication_pages_spec.rb:74:in `block (5 levels) in <top (required)>'

我的两个主要问题是:

  1. 为什么这个警告是在测试期间发生的,而不是在我将:no_capybara传递给sign_in方法的其他测试中呢?
  2. 为什么我的测试失败了,如果我没有通过no_capybara?我看到了与此练习相关的关于堆栈溢出的其他问题,其他人的解决方案不需要no_capybara。

下面是我的应用程序中可能适用的所有代码。如果我需要包括更多,请告诉我。

*users_controller.rb*

代码语言:javascript
运行
复制
before_action :admin_user,        only: :destroy 

def destroy
  user = User.find(params[:id])
  if !current_user?(user)
    user.destroy
    flash[:success] = "User destroyed.  ID: #{user.id}"
  else
    flash[:error] = "Can't delete own admin account"
  end
  redirect_to users_path
end

def admin_user
  redirect_to(root_url) unless current_user.admin?
end

*管制员/助理员/session_helper.rb*

代码语言:javascript
运行
复制
def current_user
    remember_token = User.encrypt(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
end
EN

回答 1

Stack Overflow用户

发布于 2013-10-12 18:19:41

我认为在第二种情况下,rails无法找到管理员?方法,因为它不存在。这就是为什么你要犯这个错误。

代码语言:javascript
运行
复制
NoMethodError:
undefined method `admin?' for nil:NilClass

你查过这些密码了吗

代码语言:javascript
运行
复制
$ rails generate migration add_admin_to_users admin:boolean 
$ bundle exec rake db:migrate
$ bundle exec rake test:prepare

根据您的错误,我认为rails正在寻找一个方法,而不是仅仅检查admin的布尔值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18668597

复制
相关文章

相似问题

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