无法运行单个spec文件

时间:2014-06-20 07:11:43

标签: ruby-on-rails ruby rspec factory-bot

今天,我的规格遇到了一个非常奇怪的问题。当我运行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 rspecrspec时运行良好,没有任何例外。我的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

你知道这到底是怎么回事吗?提前感谢任何线索。

1 个答案:

答案 0 :(得分:1)

您的项目require中的依赖项未能正确满足。

作为一个整体,当您运行或测试整个应用程序时,所有内容都会被加载。但是,由个别规范加载的某些单个项目文件不会处理正确的require,或者以错误的顺序处理它们(太迟而无法引用符号)。

您需要处理文件,单独运行规范,找到缺失的符号,并确保相关库在使用前为require d。一旦你以这种方式找出了正确的依赖关系,你可能想要将常见的依赖关系分解为单个帮助器。您可能希望安排它们以符合一致的风格/惯例,例如单数依赖只在需要它们的文件中获取require d,否则有两个帮助器 - 一个用于加载测试/开发依赖项,本身require d用于所有单独的测试助手和脚本,另一个用于加载应用程序运行时依赖。

另外,检查项目是否“聪明地”自动加载文件夹中的所有内容,例如

Dir["lib/*.rb"].each{ |file| require file  }

由于文件系统的原因,可以随意加载加载顺序。如果这些文件之间确实存在依赖关系,因此'x.rb'必须在'y.rb'之前加载,那么根据机器上次更改文件内容时发生的情况,您将获得系统的成功/失败。