今天,我的规格遇到了一个非常奇怪的问题。当我运行spec命令而没有指定任何特定的目录/文件时,我的测试工作得很好,全是绿色。但是,如果我指定一个目录或文件,rspec会抛出一些(随机)错误,具体取决于我是否使用带有弹簧的rspec。还有什么 - 昨天,就在我工作结束之前,一切都运转良好。从那时起我就没有碰过任何东西,现在因某种原因它被打破了。这是怎么回事:
rspec spec/requests/api/v1/users_spec.rb
结果
uninitialized constant FactoryGirl
spring stop; spring rspec spec/requests/api/v1/users_spec.rb
结果
undefined local variable or method 'some_url_helper_here'
运行spring rspec
或rspec
时运行良好,没有任何例外。我的spec文件或多或少看起来像这样:
# spec/requests/api/v1/users_spec.rb
require 'spec_helper'
describe 'Users API v1', :type => :request do
before do
@user = FactoryGirl.create(:user) # that line throws an exception about unitialized constant FactoryGirl
end
# ...
end
你知道这到底是怎么回事吗?提前感谢任何线索。
答案 0 :(得分:1)
您的项目require
中的依赖项未能正确满足。
作为一个整体,当您运行或测试整个应用程序时,所有内容都会被加载。但是,由个别规范加载的某些单个项目文件不会处理正确的require
,或者以错误的顺序处理它们(太迟而无法引用符号)。
您需要处理文件,单独运行规范,找到缺失的符号,并确保相关库在使用前为require
d。一旦你以这种方式找出了正确的依赖关系,你可能想要将常见的依赖关系分解为单个帮助器。您可能希望安排它们以符合一致的风格/惯例,例如单数依赖只在需要它们的文件中获取require
d,否则有两个帮助器 - 一个用于加载测试/开发依赖项,本身require
d用于所有单独的测试助手和脚本,另一个用于加载应用程序运行时依赖。
另外,检查项目是否“聪明地”自动加载文件夹中的所有内容,例如
Dir["lib/*.rb"].each{ |file| require file }
由于文件系统的原因,可以随意加载加载顺序。如果这些文件之间确实存在依赖关系,因此'x.rb'必须在'y.rb'之前加载,那么根据机器上次更改文件内容时发生的情况,您将获得系统的成功/失败。