我使用默认的test
用于不同的目的,我决定为运行测试套件制定一个特定的rspec
环境配置。
然而,我发现在我的ENV["RAILS_ENV"] ||= rspec
文件中更改为rails_helper.rb
时,突然发生了很多错误,常量没有被加载(FactoryGirl,DatabaseCleaner等等抛出{{1}错误)
我的问题是,在测试环境中加载这些人的代码在哪里?由于我打算将这个阶段用于其他目的,而不是运行自动测试,我害怕这个"无处不在"添加的配置可能不适合我打算做的事情。
答案 0 :(得分:2)
从Rails的角度来看,测试环境的配置和加载方式与production
或development
等任何其他环境一样。您可以在许多本机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