ruby - 升级到 Rails 4,我无法通过在 Rails 3 中通过的设计测试

标签 ruby rspec rspec-rails

未定义的局部变量或方法“login_user”

为什么我的 Controller 没有得到扩展的 ControllerMacros ???

有问题的提交:https://github.com/shadowbq/cartoque/commit/2fba99c6eac5f9f2f0da2dd464f475cae0bae520

 <snip>
 Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
 <...snip>

 <snip>
   # include devise helpers in controller specs
     config.include Devise::TestHelpers, :type => :controller
     config.extend ControllerMacros, :type => :controller
 <...snip>

/usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/example_group.rb:675:in `method_missing': undefined local variable or method `login_user' for RSpec::ExampleGroups::BackupExclusionsController:Class (NameError)
    from /home/shadowbq/sandbox/cartoque/spec/controllers/backup_exlusions_controller_spec.rb:5:in `block in <top (required)>'

<snip>
module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      @user = FactoryGirl.create(:admin)
      sign_in @user
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = FactoryGirl.create(:user)
      sign_in @user
    end
  end
end
<...snip>

这也是完整的回溯......

/usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/example_group.rb:675:in `method_missing': undefined local variable or method `login_user' for RSpec::ExampleGroups::BackupExclusionsController:Class (NameError)
    from /home/shadowbq/sandbox/cartoque/spec/controllers/backup_exlusions_controller_spec.rb:5:in `block in <top (required)>'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/example_group.rb:385:in `module_exec'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/example_group.rb:385:in `subclass'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/example_group.rb:255:in `block in define_example_group_method'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/dsl.rb:43:in `block in expose_example_group_alias'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/dsl.rb:82:in `block (2 levels) in expose_example_group_alias_globally'
    from /home/shadowbq/sandbox/cartoque/spec/controllers/backup_exlusions_controller_spec.rb:3:in `<top (required)>'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/configuration.rb:1361:in `load'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/configuration.rb:1361:in `block in load_spec_files'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/configuration.rb:1359:in `each'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/configuration.rb:1359:in `load_spec_files'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/runner.rb:102:in `setup'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/runner.rb:88:in `run'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/runner.rb:73:in `run'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/lib/rspec/core/runner.rb:41:in `invoke'
    from /usr/local/rvm/gems/ruby-2.2.3/gems/rspec-core-3.4.1/exe/rspec:4:in `<top (required)>'
    from /usr/local/rvm/gems/ruby-2.2.3/bin/rspec:23:in `load'
    from /usr/local/rvm/gems/ruby-2.2.3/bin/rspec:23:in `<main>'
    from /usr/local/rvm/gems/ruby-2.2.3/bin/ruby_executable_hooks:15:in `eval'
    from /usr/local/rvm/gems/ruby-2.2.3/bin/ruby_executable_hooks:15:in `<main>'

更多文件片段

root@ubuntu:/home/shadowbq/sandbox/cartoque# head -15 spec/controllers/backup_exlusions_controller_spec.rb 
require 'spec_helper'

describe BackupExclusionsController do

  login_user

  before do
    @backup_exclusion = BackupExclusion.create
  end

  it "gets index" do
    get :index
    assert_response :success
    assert_not_nil assigns(:backup_exclusions)
  end

https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29

最佳答案

在 rspec-rails 3 中,规范不再根据路径自动设置其类型,因此您的 Controller 规范不再具有类型 :controller。您可以:

  • 使用 config.infer_spec_type_from_file_location! 选项可以重新启用它
  • 使用 type: :controller 明确标记您的 Controller 规范

关于ruby - 升级到 Rails 4,我无法通过在 Rails 3 中通过的设计测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34006601/

相关文章:

rspec - 创建新的 stub 方法,以检查该方法是否存在于Rspec中

ruby - 将 UDP 数据包发送到 NTP 以取回数据包(在 ruby​​ 中)

javascript - 将 javascript 行添加到以 slim 编写的 ruby​​ 站点

rspec - 为sidekiq worker 编写测试

ruby-on-rails-3 - 如何 stub 部分 session 以模拟授权 session ?

ruby-on-rails - Cucumber 的 Rspec 多示例表?

regex - 触发器中的 Postgres 正则表达式匹配不正确

Python 中的 Define_method 等效项

arrays - 在数组的数组中查找元素的索引

jquery - capybara-webkit 无法模拟点击(非链接/按钮)元素