Ric*_*rmo 13 rspec ruby-on-rails rspec-rails
我正在构建一个rails 4 app.我创建了一个支持文件来模拟登录.这是文件
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)
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.rb和spec_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来运行测试.请参阅此答案和此参考以了解有关它的更多信息.
替代@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)
将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)
| 归档时间: |
|
| 查看次数: |
11787 次 |
| 最近记录: |