Как запустить одиночный тест из набора тестов rails?

Ответы:

158

ПРИМЕЧАНИЕ. Это не запускает тест через rake. Таким образом, любой код, который у вас есть Rakefile, НЕ будет выполнен.

Чтобы запустить один тест, используйте следующую команду из основного каталога вашего проекта rails:

ruby -I test test/unit/my_model_test.rb -n test_name

Это запускает единственный тест с именем «name», определенный в классе MyModelTest в указанном файле. Test_name формируется путем добавления к имени теста слова «test» и последующего разделения слов подчеркиванием. Например:

class MyModelTest < ActiveSupport::TestCase

  test "valid with good attributes" do
    # do whatever you do
  end

  test "invalid with bad attributes" do
    # do whatever you do
  end
end

Вы можете запустить оба теста с помощью:

ruby -I test test/unit/my_model_test.rb

и только второй тест через

ruby -I test test/unit/my_model_test.rb -n test_invalid_with_bad_attributes
Дэррил
источник
4
У меня это не работает (на функциональных или модульных тестах). Я понимаю 0 tests, 0 assertions, 0 failures, 0 errors. Рельсы 3.0.7.
B Seven
10
Я лично поклонник формы регулярных выражений: -n "/good/". Экранирование оболочки - это всегда весело, поэтому я предпочитаю использовать простые регулярные выражения, но это намного проще, чем постоянно писать полное имя теста.
Groxx
4
Важно отметить, что для того, чтобы это сработало, вы не должны находиться в каталоге MAIN, как указано в ответе, а в подкаталоге, который содержит test/папку. Например, если я хочу запустить тест, activesupport/test/core_ext/array_ext_test.rbя должен быть activesupport/первым.
Винсент Б.
3
@Groxx - Наконец-то решение! Спасибо! -n "/good/"работал.
B Seven
Будьте осторожны, выполняя это в 2018+. Он обходит некоторые задачи тестирования, встроенные в рельсы (например, db: test: prepare), которые используются для многих вещей, таких как замена локальных данных на данные фикстур и их повторное восстановление. Запуск этого уничтожил мою локальную базу данных. Рассмотрим решение, в котором используются встроенные задачи тестирования рельсов, например stackoverflow.com/a/47006811/1154642 (который работал у меня).
bryanbraun
101

Запустите тестовый файл :

rake test TEST=tests/functional/accounts_test.rb

Запустите один тест в тестовом файле:

rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n /paid accounts/"

(Из комментария @Puhlze.)

laffuste
источник
10
Кроме того, если вы хотите запустить один тест в данном файле, вы можете добавить переменную среды TESTOPTS, которая будет передана в тест. EG rake test TEST = tests / financial / accounts_test.rb TESTOPTS = "- n / платные аккаунты /"
Пульце
1
если последняя тестовая команда не работает, попробуйте rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n '/paid accounts/'"/paid accounts/одинарных кавычках)
rrw
40

Для рельсов 5:

rails test test/models/my_model.rb
Джеймс
источник
9
Но это запускает все тестовые случаи в файле, вопрос просит запустить один тест ...
user000001
Вы можете запустить одиночный тест, добавив номер строки к имени файла:bin/rails test test/models/user_test.rb:27
Segfault
31

Благодаря @James ответ, кажется, таков:

rails test test/models/my_model.rb:22

Предположим, что 22 - это номер строки данного теста. По рельсам помогают:

 $ rails test --help

Вы можете запустить одиночный тест, добавив номер строки к имени файла:

    bin/rails test test/models/user_test.rb:27

Также обратите внимание, что ваш тест должен наследовать от ActionDispatch :: IntegrationTest, чтобы это работало (это была моя ошибка):

class NexApiTest < ActionDispatch::IntegrationTest
.
.
.
Рузбех Забихоллахи
источник
4
Это, по-видимому, лучший ответ, основанный на руководствах Rails, по крайней мере, для тестирования конкретной строки.
tfantina
12

В рельсах 5,

Я использовал этот способ для запуска одного тестового файла (все тесты в одном файле)

rails test -n /TopicsControllerTest/ -v

посмотрите здесь https://stackoverflow.com/a/41183694/3626659

Alupotha
источник
1
это лучший ответ на вопрос о последних версиях рельсов, +1
user000001 07
5

Чтобы запустить один тест в реальном наборе Rails:

bundle exec ruby -I"railties/test" actionpack/test/template/form_options_helper_test.rb
Брайан Роуз
источник
3

Это был мой глупый полуночный вопрос. Rails любезно распечатывает команду, которую он выполняет rake test. Остальное - это упражнение вырезания и вставки.

~/projects/rails/actionpack (my2.3.4)$ ruby -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/controller/base_test.rb"
artemave
источник
2

Если вы хотите запустить один тест, вы можете просто запустить его как обычный скрипт Ruby.

ruby actionmailer/test/mail_layout_test.rb

Вы также можете запустить целый пакет (например, ActiveRecord или ActionMailer), войдя cdв каталог и запустив его rake testвнутри.

Aupajo
источник
1
Не в Rails - по крайней мере, не с созданными по умолчанию тестовыми файлами. У них есть «require 'test_helper'» в первой строке, но путь загрузки не был установлен вовремя. Если вы измените каждую первую строку на явное требование ("require File.join (File.dirname ( FILE ), '..', 'test_helper')"), то ваше решение будет работать.
Джеймс А. Розен,
кхм, этоrequire File.join(File.dirname(__FILE__), '..', 'test_helper')
Джеймс А. Розен
@Gaius перепроверил. Первый не работает, но cd-ing in работает. Для ясности (не уверен, что я это неправильно читаю, но вы сказали «сгенерированные тестовые файлы»), это для самой библиотеки Rails, а не для проекта Rails.
Aupajo
2

В моей ситуации rakeработает только TESTOPTS="-n='/sample/'":

bundle exec rake test TEST=test/system/example_test.rb TESTOPTS="-n='/sample/'"
N0xFF
источник
0

Сначала зайдите в папку библиотеки, которую вы хотите протестировать (это важно), а затем запустите:

~/Projects/rails/actionview (master)$ ruby -I test test/template/number_helper_test.rb 
Диего Плентц
источник
0

Папка Rails

  bundle install
  bundle exec ruby -I"activerecord/test" activerecord/test/cases/relation/where_test.rb 

Обратите внимание, что вам нужно загрузить соответствующую папку: «activerecord / test» (где у вас есть тест)

Игорь Касьянчук
источник