Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails rspec与Desive gem共享的示例_Ruby On Rails_Rspec_Devise - Fatal编程技术网

Ruby on rails rails rspec与Desive gem共享的示例

Ruby on rails rails rspec与Desive gem共享的示例,ruby-on-rails,rspec,devise,Ruby On Rails,Rspec,Devise,我有这些共享的示例,用于测试控制器身份验证的方法 支持/控制器/身份验证\u helpers.rb module ControllerHelpers include Devise::TestHelpers shared_examples_for 'authenticate user' do |user, method, action, url_params={}| before(:each) do setup_controller_for_warden

我有这些共享的示例,用于测试控制器身份验证的方法

支持/控制器/身份验证\u helpers.rb

module ControllerHelpers
  include Devise::TestHelpers

  shared_examples_for 'authenticate user' do |user, method, action, url_params={}|
    before(:each) do 
      setup_controller_for_warden
      request.env["devise.mapping"] = Devise.mappings[:user]
    end
    it "should redirect visitors to login page" do
      sign_out user
      if method == :get
        get action, url_params
      elsif method == :post
        post action, url_params
      elsif method == :put
        put action, url_params
      elsif method == :delete
        delete action, url_params
      end
      response.should redirect_to new_user_session_path
    end
    it "should allow user" do
      sign_in user
      if method == :get
        get action, url_params
      elsif method == :post
        post action, url_params
      elsif method == :put
        put action, url_params
      elsif method == :delete
        delete action, url_params
      end
      response.should be_success
    end
  end

end
require 'spec_helper'

describe BriefController do
  render_views

  before(:all) do
    @customer=Factory(:customer)
    @project=Factory(:project_started, :owner => @customer)
  end

  context 'get :new' do
    it_behaves_like 'authenticate user', @customer, :get, :new, {:project_id => @project.to_param} 
  end
end
context 'get :new' do
    it_behaves_like 'authenticate user', :get, :new do 
      let(:user) { @customer }
      let(:url_params) { { :project_id => @project.to_param } }
    end
  end
我想把它和我的控制器规范文件一起使用

简要说明控制器规范rb

module ControllerHelpers
  include Devise::TestHelpers

  shared_examples_for 'authenticate user' do |user, method, action, url_params={}|
    before(:each) do 
      setup_controller_for_warden
      request.env["devise.mapping"] = Devise.mappings[:user]
    end
    it "should redirect visitors to login page" do
      sign_out user
      if method == :get
        get action, url_params
      elsif method == :post
        post action, url_params
      elsif method == :put
        put action, url_params
      elsif method == :delete
        delete action, url_params
      end
      response.should redirect_to new_user_session_path
    end
    it "should allow user" do
      sign_in user
      if method == :get
        get action, url_params
      elsif method == :post
        post action, url_params
      elsif method == :put
        put action, url_params
      elsif method == :delete
        delete action, url_params
      end
      response.should be_success
    end
  end

end
require 'spec_helper'

describe BriefController do
  render_views

  before(:all) do
    @customer=Factory(:customer)
    @project=Factory(:project_started, :owner => @customer)
  end

  context 'get :new' do
    it_behaves_like 'authenticate user', @customer, :get, :new, {:project_id => @project.to_param} 
  end
end
context 'get :new' do
    it_behaves_like 'authenticate user', :get, :new do 
      let(:user) { @customer }
      let(:url_params) { { :project_id => @project.to_param } }
    end
  end
当我运行这些规范文件时,我遇到了错误

Failure/Error: sign_in user
     RuntimeError:
       Could not find a valid mapping for

你知道我如何处理这个错误吗?

我在这里可能是错的,但我认为:

@customer=Factory(:customer)
@project=Factory(:project_started, :owner => @customer)
应该是:

@customer=FactoryGirl(:customer)
@project=FactoryGirl(:project_started, :owner => @customer)

简单的错误,我自己也犯过几次。尝试一下,看看它是否能解决问题,希望能有所帮助

我认为问题在于
的参数的行为类似于
在执行
代码之前的
,因此第一个参数(
@user
)的计算结果为
nil
,导致了进一步的问题。我花了很多时间用自己的代码来解决这个问题


关于一个相关的问题,我最近读到一条建议,避免在这些类型的测试中使用实例变量,因为您希望在未定义它们时引用它们失败。这对我来说很有意义,我现在就是这么做的。

我用let block作为实例变量来解决我的问题

shared_examples_for 'authenticate user' do |method, action|
    before(:each) do 
      setup_controller_for_warden
      request.env["devise.mapping"] = Devise.mappings[:user]
    end
    it "should redirect visitors to login page" do
      if method == :get
        get action, url_params
      elsif method == :post
        post action, url_params
      elsif method == :put
        put action, url_params
      elsif method == :delete
        delete action, url_params
      end
      response.should redirect_to new_user_session_path
    end
控制器规范rb

module ControllerHelpers
  include Devise::TestHelpers

  shared_examples_for 'authenticate user' do |user, method, action, url_params={}|
    before(:each) do 
      setup_controller_for_warden
      request.env["devise.mapping"] = Devise.mappings[:user]
    end
    it "should redirect visitors to login page" do
      sign_out user
      if method == :get
        get action, url_params
      elsif method == :post
        post action, url_params
      elsif method == :put
        put action, url_params
      elsif method == :delete
        delete action, url_params
      end
      response.should redirect_to new_user_session_path
    end
    it "should allow user" do
      sign_in user
      if method == :get
        get action, url_params
      elsif method == :post
        post action, url_params
      elsif method == :put
        put action, url_params
      elsif method == :delete
        delete action, url_params
      end
      response.should be_success
    end
  end

end
require 'spec_helper'

describe BriefController do
  render_views

  before(:all) do
    @customer=Factory(:customer)
    @project=Factory(:project_started, :owner => @customer)
  end

  context 'get :new' do
    it_behaves_like 'authenticate user', @customer, :get, :new, {:project_id => @project.to_param} 
  end
end
context 'get :new' do
    it_behaves_like 'authenticate user', :get, :new do 
      let(:user) { @customer }
      let(:url_params) { { :project_id => @project.to_param } }
    end
  end

感谢您的关注,但我在所有型号规格中都使用了这些线条,它工作正常。