Tom*_*Tom 7 rake unit-testing ruby-on-rails-3
我正在为Rails 3项目编写简单的单元测试,但我无法实际执行任何测试.
例如,尝试运行Rails自动生成的测试失败:
require 'test_helper'
class UserTest < ActiveSupport::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end
Run Code Online (Sandbox Code Playgroud)
导致以下错误:
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
test_helper (LoadError)
from <internal:lib/rubygems/custom_require>:29:in `require'
from user_test.rb:1:in `<main>'
Run Code Online (Sandbox Code Playgroud)
注释掉require'test_helper'行并尝试运行测试会导致此错误:
user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)
Run Code Online (Sandbox Code Playgroud)
动作包宝石似乎已正确安装并且是最新的:
actionmailer (3.0.3, 2.3.5)
actionpack (3.0.3, 2.3.5)
activemodel (3.0.3)
activerecord (3.0.3, 2.3.5)
activeresource (3.0.3, 2.3.5)
activesupport (3.0.3, 2.3.5)
Run Code Online (Sandbox Code Playgroud)
Ruby为1.9.2p0,Rails为3.0.3.
我的测试目录的示例转储如下:
/fixtures
/functional
/integration
/performance
/unit
-- /helpers
-- user_helper_test.rb
-- user_test.rb
test_helper.rb
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这个问题 - 我已经运行了典型的rake任务来准备测试环境.我的应用程序或环境配置文件中没有任何异常,也没有安装任何会干扰测试环境的异常宝石.
编辑3月9日
Xavier Holt的建议,明确指定test_helper的路径有效; 但是,这表明ActiveSupport存在问题.
现在,当我尝试运行测试时,收到以下错误消息(如上所列):
user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)
Run Code Online (Sandbox Code Playgroud)
但正如您在上面所看到的,Action Pack已全部安装并更新至今.
编辑3月13日
尝试使用rake test:units以下堆栈运行测试时,会将跟踪转储到控制台:
test/unit/bookmark_test.rb:3:in `<top (required)>': uninitialized constant Objec
t::ActiveSupport (NameError)
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `load'
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `block in <main>'
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `each'
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `<main>'
rake aborted!
Run Code Online (Sandbox Code Playgroud)
所以查看上面列出的文件,我看到以下内容:
#!/usr/bin/env ruby
# Load the test files from the command line.
ARGV.each { |f| load f unless f =~ /^-/ }
Run Code Online (Sandbox Code Playgroud)
据我所知,一切看起来都像预期的那样.
Rya*_*igg 10
您的test/test_helper文件应该是在生成应用程序时创建的.它包含这个有价值的内容:
ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
class ActiveSupport::TestCase
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
#
# Note: You'll currently still have to declare fixtures explicitly in integration tests
# -- they do not yet inherit this setting
fixtures :all
# Add more helper methods to be used by all tests here...
end
Run Code Online (Sandbox Code Playgroud)
这里的第二行是最重要的:它需要config/environment.rb你的应用程序根目录下的文件,这反过来需要很多其他东西,包括有价值的(我今天喜欢这个词,好吗?)ActiveSupport常量.
当您生成控制器,模型或脚手架时,它也会为这些生成测试.我刚刚rails g scaffold ticket在我的应用程序中运行并生成test/unit/ticket_test.rb了包含以下内容:
require 'test_helper'
class TicketTest < ActiveSupport::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end
Run Code Online (Sandbox Code Playgroud)
该文件的第一行将需要test/test_helper.rb我们看到的文件.这将加载ActiveSupport其中的TestCase类,从而使该测试可行.其他一切都从那里流过.
有了所有的解释(即使它已经是你已经知道的东西),我正在对它进行一次大赌注,这是一个大规模的赌注LOAD_PATH,导致test目录被删除.
真正不寻常的是,当你确定指定它的完整路径时,test/test_helper.rb它会加载它,但ActiveSupport仍未定义.那么,应该根据上面的描述加载.它真的加载了config/environment.rb吗?你能放点如下:
puts "LOADING CONFIG/ENVIRONMENT.RB"
Run Code Online (Sandbox Code Playgroud)
在config/environment.rb文件的顶部,然后再次运行测试?它应该输出.很不寻常.
继续关于LOAD_PATH...有一个肮脏的小秘密,你没有告诉我们什么?
实际上,Dan Cheail提出了一个很好的观点.您可能正在运行测试,ruby test/unit/ticket_test.rb在这种情况下test_helper将无法使用,但仍然无法解释为什么在指定完整路径时仍然会得到未定义的常量ActiveSupport.
如果你想运行一个测试,你应该这样做:
ruby -Itest test/unit/ticket_test.rb
Run Code Online (Sandbox Code Playgroud)
该-I选项将test目录添加到加载路径,这意味着该test_helper文件将通过笔直可用require 'test_helper'.如果在此之后它仍然出错,我认为你test/test_helper.rb是空的还是坏的.
| 归档时间: |
|
| 查看次数: |
5110 次 |
| 最近记录: |