Rspec NameError,如何重构此代码并正确使用路由助手?

时间:2013-02-16 10:30:57

标签: ruby-on-rails testing rspec refactoring ruby-on-rails-3.2

我正在努力让以下工作:

#spec/features/senseis_spec.rb
require 'spec_helper'

describe "Senseis" do
  subject { page }
  @paths = [senseis_path, new_sensei_path, edit_sensei_path(1), sensei_path(1)]

  describe "sensei can not access" do
    before { login_as_sensei }

    @paths.each do |path|
      describe "#{path}" do
        before { visit path }
        it { should have_selector(error, text: "You are not authorized") }
      end
    end
  end

end

但它给了我一个错误NameError: undefined local variable or method 'senseis_path'

我已尝试将config.include Rails.application.routes.url_helpers添加到规范帮助器中,但它没有帮助。

漫长的道路:

describe "sensei can not access" do
  before { login_as_sensei }

  describe "senseis#index" do
    before { visit senseis_path }
    it { should have_selector(error, text: "You are not authorized") }
  end
end

理想情况下,我想在另一个文件中定义它,然后只需调用deny_access_to(path_one, path_two, ...)

P.S。 error在其他地方定义。

路线:

                  root        /                             dashboard#index
               senseis GET    /senseis(.:format)            senseis#index
                       POST   /senseis(.:format)            senseis#create
            new_sensei GET    /senseis/new(.:format)        senseis#new
           edit_sensei GET    /senseis/:id/edit(.:format)   senseis#edit
                sensei GET    /senseis/:id(.:format)        senseis#show
                       PUT    /senseis/:id(.:format)        senseis#update
                       DELETE /senseis/:id(.:format)        senseis#destroy
    new_sensei_session GET    /user/sign_in(.:format)       devise/sessions#new
        sensei_session POST   /user/sign_in(.:format)       devise/sessions#create
destroy_sensei_session DELETE /user/sign_out(.:format)      devise/sessions#destroy
       sensei_password POST   /user/password(.:format)      devise/passwords#create
   new_sensei_password GET    /user/password/new(.:format)  devise/passwords#new
  edit_sensei_password GET    /user/password/edit(.:format) devise/passwords#edit
                       PUT    /user/password(.:format)      devise/passwords#update

1 个答案:

答案 0 :(得分:2)

尝试类似

的内容
require 'spec_helper'

describe "Senseis" do

  def should_deny_access_to(paths)
    paths.each do |path|
      login_as_sensei
      visit path
      page.should have_selector(error, text: "You are not authorized")
    end
  end

  it { should_deny_access_to [senseis_path, new_sensei_path, edit_sensei_path(1), sensei_path(1)] }

end 

或使用共享示例组。