如何包含rspec的支持文件

Ric*_*rmo 13 rspec ruby-on-rails rspec-rails

我正在构建一个rails 4 app.我创建了一个支持文件来模拟登录.这是文件

规格/支持/ spec_test_helper.rb

module SpecTestHelper
  def login(user)
    request.session[:user_id] = user.id
  end

  def current_user
    User.find(request.session[:user_id])
  end
end
Run Code Online (Sandbox Code Playgroud)

spec_helper.rb

config.include SpecTestHelper, :type => :controller
Run Code Online (Sandbox Code Playgroud)

控制器规格

describe BooksController, "user role" do

  user = Fabricate(:user) do
    role { Role.find_by_account_type("user") }
  end

  login(user)
end
Run Code Online (Sandbox Code Playgroud)

支持文件给出了未定义的方法错误.这是错误消息的一部分:

spec/controllers/books_controller_spec.rb:27:in `block in <top (required)>': undefined method `login' for #<Class:0x007f9f83193438> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

我正在测试CanCan.我知道测试CanCan的正确方法是测试能力,但已经完成了.

got*_*tva 21

我添加了这一行spec_helper.rb,它在第三个Rails中工作

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
Run Code Online (Sandbox Code Playgroud)

也许存在另一种(更漂亮的)解决方案


Sau*_*iar 10

rspec目录下可以有两个文件:rails_helper.rbspec_helper.rb.如果要为依赖于rails的类提供支持,则应该rails_helper告诉rails在'spec/support'dir 下加载模块.

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
Run Code Online (Sandbox Code Playgroud)

要声明共享模块,您需要在配置块中使用它.

RSpec.configure do |config|
  ...
  config.include <YourModuleName>::<YourClassName>, :type => :controller
  ...
end
Run Code Online (Sandbox Code Playgroud)

但是,如果你的类根本不需要rails,你可以加载它spec_helper,它不会加载rails来运行测试.请参阅此答案此参考以了解有关它的更多信息.


ale*_*333 5

替代@gotva提供的答案。它稍微冗长一些,但是在Rails 3和Rails 4中都可以使用:

Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f} 
Run Code Online (Sandbox Code Playgroud)


Ash*_*son 1

login(user)调用放在一个before或一个it块中,而不是直接放在describe

let(:user) do
  Fabricate(:user) do
    role { Role.find_by_account_type("user") }
  end
end

before do
  login(user)
end
Run Code Online (Sandbox Code Playgroud)