Как запустить консоль Rails в тестовой среде и загрузить test_helper.rb?

121

Предыстория: у меня возникли проблемы с гемом Thoughtbot "Factory Girl", который используется для создания объектов для использования в модульных и других тестах. Я хотел бы перейти к консоли и запустить разные вызовы Factory Girl, чтобы проверить, что происходит. Например, я бы хотел пойти туда, где ...

>> Factory(:user).inspect

Я знаю, что вы можете запускать консоль в разных средах ...

$ script / console RAILS_ENV = тест

Но когда я это делаю, класс 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

Grr. Argh.

Итан
источник
1
Следовательно, если бы вы поместили тест RAILS_ENV = перед скриптом / консолью, он работал бы так, как вы ожидаете.
Джаред

Ответы:

192

Для Rails <3.0

Беги script/console --help. Вы заметите, что синтаксис такой script/console [environment], как в вашем случае script/console test.

Я не уверен, нужен ли вам помощник по тестированию или тестовая среда делает это за вас, но с помощью этой команды вы, по крайней мере, сможете успешно загрузиться в тестовую среду.

В качестве примечания: действительно странно, что различные двоичные файлы в script / имеют разные способы настройки среды rails.

Для рельсов 3 и 4

Беги rails c test. Подготовьте, bundle execесли вам это нужно для текущей среды приложения.

Для Rails 5 и 6

Беги rails console -e test.

Август Лиллеас
источник
63
В рельсах 3 это простоrails console [environment]
Идрис Мохтарзада
26
Это немного непоследовательно, потому что для запуска сервера вы вводитеrails server -e test
Джейсон
В Rails 5 это все еще работает. И вам действительно нужно загрузить хотя бы некоторые части вашей среды - в моем случае features/support/helpers.rbне загружались автоматически. Кроме того, Rack::Testне загружается.
Деррелл Дарретт
61

В Rails 3 просто выполните rails console testили rails console productionили rails console development(по умолчанию).

sivabudh
источник
10
script/console test

Должно быть все, что вам нужно.

Дэвид Смит
источник
8

Для Rails 5.2.0: «Передача имени среды в качестве обычного аргумента устарела и будет удалена в следующей версии Rails. Пожалуйста, используйте вместо этого параметр -e».

rails c -e test
Тови Ньюман
источник
4

Вы можете указать среду, в которой должна работать консольная команда.

rails c [environment]

Примеры

1) Для постановки

rails c staging

2) Для производства

rails c production

Источник и подробное описание: Командная строка Rails

Аамир
источник
3

Дэвид Смит прав, просто сделай

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.

Это бит [окружающая среда] .

Purplejacket
источник
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

Ник Дэвис
источник
Вместо метода проб или ошибок - используйте руководство по API rails, чтобы найти то, что ему нужно api.rubyonrails.org/classes/ActiveSupport/TestCase.html ... вероятно, это тестовый порядок, который :randomпо умолчанию
Мирв - Мэтт
Для ActiveSupport :: TestCase описаны только эти два метода класса, поэтому я не понимаю, от какого класса / модуля он наследует свой initializeметод. Но похоже, что ожидаемый параметр сохраняется как @NAMEв созданном объекте.
Ник Дэвис
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

Env разработки

rails console # or just rails c
anyavacy
источник
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
Тусиф Муртаза
источник