如何在测试环境中运行Rails控制台并加载test_helper.rb?

133

背景:我在使用Thoughtbot的“Factory Girl” gem时遇到了一些问题,该gem用于创建对象以在单元测试和其他测试中使用。我想进入控制台并运行不同的Factory Girl调用以查看发生了什么。例如,我想进入那里并执行...

>> Factory(:user).inspect

我知道你可以在不同的环境下运行控制台...

$ script/console RAILS_ENV=test

但是当我这样做时,Factory 类不可用。看起来 test_helper.rb 没有被加载。

我尝试了各种各样的 require 调用,包括使用 test_helper.rb 的绝对路径,但它们都失败了,类似于这样:

$ script/console RAILS_ENV=test
>> require '/Users/ethan/project/contactdb/test/test_helper.rb'
  Errno::ENOENT: No such file or directory - 
  /Users/ethan/project/contactdb/config/environments/RAILS_ENV=test.rb

呃。啊。


2
因此,如果您将RAILS_ENV=test放置在script/console之前,它将像您预期的那样工作。 - Jared
10个回答

219

针对 Rails < 3.0

运行script/console --help。你会注意到语法是script/console [环境],在你的情况下是script/console test

我不确定是否需要require测试助手或者测试环境是否已经为您做了这些事情,但使用该命令,您至少应该能够成功地启动测试环境。

附带说明:确实有点奇怪的是,script/中的各种二进制文件设置Rails环境的方式不同。

针对 Rails 3 和 4

运行rails c test。如果需要用于当前应用程序环境,请添加bundle exec前缀。

针对 Rails 5 和 6

运行rails console -e test


63
在 Rails 3 中,只需使用 rails console [环境] 命令即可。 - Idris Mokhtarzada
26
有点不一致,因为要启动服务器需要输入 rails server -e test - Jason
在Rails 5中,这仍然有效。而且,您确实需要加载至少一些环境 - 在我的情况下,features/support/helpers.rb没有自动加载。此外,Rack::Test也没有加载。 - Derrell Durrett

62
在Rails 3中,只需执行rails console testrails console productionrails console development(这是默认值)。

14

对于Rails 5.2.0:传递环境名称作为常规参数已被弃用,并将在下一个Rails版本中移除。请改用-e选项。

rails c -e test

10
script/console test

这应该是你所需要的全部。


4

您可以指定控制台命令应该在哪个环境中运行。

rails c [environment]

示例

1)用于临时环境(Staging)

rails c staging

2) 生产环境下

rails c production

源代码和详细说明请参考:Rails命令行


3

David Smith 是正确的,只需要执行

script/console test

帮助命令将显示此操作的原因:

$ script/console -h
Usage: console [environment] [options]
    -s, --sandbox                    Rollback database modifications on exit.
        --irb=[irb]                  Invoke a different irb.
        --debugger                   Enable ruby-debugging for the console.

这是与 [环境] 相关的一部分。

2

我理解你的痛苦。实际上这里有三个不同的问题,其中一些已经得到了解决,而另一些则没有:

  1. 如何在测试环境中启动控制台?

    对于最新的Rails版本,可以使用bundle exec rails c test或其他类似语法。

  2. 如何确保test/test_helper.rb被加载到控制台会话中?

    类似于require './test/test_helper'的语句应该就可以做到。对我而言,这将返回true,表示在我启动控制台时它还没有被加载。如果该语句返回false,则你只是浪费了一些击键,但仍然可以继续。

  3. 一旦test_helper被加载,如何调用其中定义的方法?

    在典型的test_helper中,自定义方法通常被定义为ActiveSupport::TestCase的实例方法。因此,如果要调用其中一个方法,需要该类的一个实例。通过试错发现,ActiveSupport::TestCase.new有一个必需的参数,所以...传递一些内容。

    如果你的test_helper有一个名为create_user的方法,可以这样调用它: ActiveSupport::TestCase.new("no idea what this is for").create_user


不要试错,使用 Rails API 指南找到需要的内容http://api.rubyonrails.org/classes/ActiveSupport/TestCase.html … 默认情况下,它可能是测试顺序为 :random - Mirv - Matt
ActiveSupport::TestCase 只有这两个类方法,所以我不清楚它从哪个类/模块继承了 initialize 方法。但是看起来它期望的参数会被存储为创建对象的 @NAME - Nick Davies

1
请确保您已安装了GEM,并在您的environment.rb或test.rb文件中添加了以下行。
config.gem "thoughtbot-factory_girl", :lib => "factory_girl", :source => "http://gems.github.com"

0

测试环境

rails console test # or just rails c test

开发环境

rails console # or just rails c

0

运行 Rails 控制台测试环境的命令是

rails c -e test

或者

RAILS_ENV=test rails c

如果你遇到了类似的问题

ActiveRecord::StatementInvalid:
   Mysql2::Error: Table 'DB_test.users' doesn't exist: SHOW FULL FIELDS FROM `users`

那么,您应该先通过运行以下命令来准备测试数据库:

bundle exec rake db:test:prepare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接