Rspec - 测试环境的额外配置在哪里?

时间:2016-04-18 21:20:14

标签: ruby-on-rails ruby rspec

我使用默认的test用于不同的目的,我决定为运行测试套件制定一个特定的rspec环境配置。

然而,我发现在我的ENV["RAILS_ENV"] ||= rspec文件中更改为rails_helper.rb时,突然发生了很多错误,常量没有被加载(FactoryGirl,DatabaseCleaner等等抛出{{1}错误)

我的问题是,在测试环境中加载这些人的代码在哪里?由于我打算将这个阶段用于其他目的,而不是运行自动测试,我害怕这个"无处不在"添加的配置可能不适合我打算做的事情。

2 个答案:

答案 0 :(得分:2)

从Rails的角度来看,测试环境的配置和加载方式与productiondevelopment等任何其他环境一样。您可以在许多本机Rails命令中看到此前缀RAILS_ENV=test,例如RAILS_ENV=test rails c将为测试环境加载rails控制台,依此类推。同样,Rails中的所有特定于测试的配置都在test.rb文件夹的config/environments中定义。

然而,当您使用rspec spec运行规范时,您实际上正在启动RSpec运行程序,对于大多数意图和目的,它运行独立于Rails(即使使用rspec-rails宝石)。

按照惯例,当RSpec启动时,首先它是从当前目录中的.rspec读取命令行参数(如果存在)。然后它运行spec_helper.rb(以及rails_helper.rb 3+的rspec-rails。它实际上是spec_helper.rb,它为您的测试加载Rails环境以及您在测试中使用的任何模块(例如DatabaseCleaner)做了所有繁重的工作。 ,FactoryGirl等。

如果您想知道RSpec如何挂钩到Rails,那么大部分都是在这一行中执行的,它引导了Rails。

require File.expand_path('../../config/environment', __FILE__)

现在,关于你的问题,如果没有ENV['RAILS_ENV'] ||= 'test'语句,上面的行将在默认环境(开发)中加载Rails,这不是你想要的,因为任何宝石都不在{不会加载{1}}组,也不会加载:test

<强> TL; DR

测试配置由两个文件处理:environments/test.rb(有时名为spec/spec_helper.rb)和rails_helper.rb。前者配置RSpec以及将在config/environments/test.rb中使用的文件中专门使用的任何对象和模块,后者配置您的Rails应用程序本身。省略spec加载开发环境和gemsets而不是测试环境和gemsets,这就是为什么你会遇到大量错误。

答案 1 :(得分:1)

如果您为FactoryGirl,DatabaseCleaner等出现r1错误,则很可能将其包含在uninitialized constant的{​​{1}}组中。

您应该将它们移至test组,例如:

Gemfile