【发布时间】:2010-12-03 04:03:06
【问题描述】:
如何从 Rails 测试套件运行单个测试?
rake test ANYTHING 似乎没有帮助。
【问题讨论】:
标签: ruby-on-rails unit-testing rake
如何从 Rails 测试套件运行单个测试?
rake test ANYTHING 似乎没有帮助。
【问题讨论】:
标签: ruby-on-rails unit-testing rake
注意: 这不会通过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
【讨论】:
0 tests, 0 assertions, 0 failures, 0 errors。导轨 3.0.7。
-n "/good/"。 Shell 转义总是很有趣,所以我倾向于坚持使用简单的正则表达式,但这比一直写出完整的测试名称要容易得多。
test/ 文件夹的子目录中。例如,如果我想运行测试activesupport/test/core_ext/array_ext_test.rb,我应该先在activesupport/。
-n "/good/" 工作。
运行测试文件:
rake test TEST=tests/functional/accounts_test.rb
在测试文件中运行单个测试:
rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n /paid accounts/"
(来自@Puhlze 的评论。)
【讨论】:
rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n '/paid accounts/'"(用单引号括起来/paid accounts/)
对于轨道 5:
rails test test/models/my_model.rb
【讨论】:
bin/rails test test/models/user_test.rb:27
感谢@James,答案似乎是:
rails test test/models/my_model.rb:22
假设 22 是给定测试的行号。根据rails帮助:
$ rails test --help您可以通过将行号附加到文件名来运行单个测试:
bin/rails test test/models/user_test.rb:27
另外,请注意,您的测试应该继承自 ActionDispatch::IntegrationTest 才能正常工作(这是我的错误):
class NexApiTest < ActionDispatch::IntegrationTest
.
.
.
【讨论】:
我用这种方式运行单个测试文件(一个文件中的所有测试)
rails test -n /TopicsControllerTest/ -v
另一种选择是使用行号(打印在失败的测试下方):
rails test test/model/my_model.rb:15
【讨论】:
_。例如,-n "/many_num/" 将匹配 test "many numbers" do 和 test "many numbered items" do 等。
在我的情况下,rake 仅适用于TESTOPTS="-n='/your_test_name/'":
bundle exec rake test TEST=test/system/example_test.rb TESTOPTS="-n='/your_test_name/'"
【讨论】:
=(-n= 中的那个)的情况下工作,但现在它一直认为它是一个文件名。
在实际的 Rails 套件中运行单个测试:
bundle exec ruby -I"railties/test" actionpack/test/template/form_options_helper_test.rb
【讨论】:
这是我的一个愚蠢的午夜问题。 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"
【讨论】:
最好的方法是直接查看指南:http://guides.rubyonrails.org/contributing_to_ruby_on_rails.html#running-tests
cd actionmailer
bundle exec ruby -w -Itest test/mail_layout_test.rb -n test_explicit_class_layout
【讨论】:
如果您想运行单个测试,您可以将它们作为常规 Ruby 脚本运行
ruby actionmailer/test/mail_layout_test.rb
您还可以通过 cd-ing 进入目录并在其中运行 rake test 来运行整个套件(例如 ActiveRecord 或 ActionMailer)。
【讨论】:
require File.join(File.dirname(__FILE__), '..', 'test_helper')
cd-ing in 起作用。明确一点(我不确定我是否误读了这篇文章,但您确实说过“生成的测试文件”),这是针对 Rails 库本身的,不是 Rails 项目。
要重新运行刚刚失败的测试,请将失败的测试名称复制粘贴到
rails test -n [test-name]
当您的测试套件报告此情况时:
> rails test
...
Error:
PlayersControllerTest#test_should_show_player:
ActionView::Template::Error: no implicit conversion from nil to integer
你用这个重新运行失败的测试:
rails test -n PlayersControllerTest#test_should_show_player
【讨论】:
首先,访问你要测试的库的文件夹(这很重要),然后运行:
~/Projects/rails/actionview (master)$ ruby -I test test/template/number_helper_test.rb
【讨论】:
Rails 文件夹
bundle install
bundle exec ruby -I"activerecord/test" activerecord/test/cases/relation/where_test.rb
注意你需要加载适当的文件夹:“activerecord/test”(你有测试的地方)
【讨论】: