我正在努力深入了解RSpec和Rails如何加载文件,而不仅仅是解决这一特定问题。
我的rails应用程序有一个共同的结构,带有一个新文件夹:
my_app/
/assets
/controllers
/...
/services (new folder)
/spec
在spec文件夹中,我有一个测试。此时,它只测试我的类的新实例的创建
require 'rails_helper'
RSpec.describe MyClass do
context 'something' do
it 'does something' do
instance = MyClass.new
end
end
end
MyClass有点特殊,因为在它的构造函数中注入了来自其他类的依赖项:
class MyClass
def initialize(dependency = MyDependency.new)
@dependency = dependency
end
end
为了使它更复杂,MyDependency属于一组公共类,它们继承自基类:
require 'my_base'
class MyDependency < MyBase
end
此代码失败,但出现以下异常:
Failure/Error: instance = MyClass.new
NoMethodError:
undefined method `value' for nil:NilClass
我的测试与spec_helper.rb位于同一文件夹中。这个助手以:
开头ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
我不明白什么是允许RSpec访问rails文件的机制,以及我的services文件夹。它应该考虑MyClass,MyBase和MyDependency。
答案 0 :(得分:2)
RSpec依赖于Rails和Ruby自动加载,并在http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/中解释了Rails和Ruby自动加载。但是,自动加载可能与您在上面显示的错误无关。要了解那里发生的事情,你应该看一下(如果你对帮助感兴趣)分享回溯和相关代码(例如调用.value
的内容)。