gpt4 book ai didi

unit-testing - 给定一个典型的 Rails 3 环境,为什么我无法执行任何测试?

转载 作者:行者123 更新时间:2023-12-03 00:48:54 25 4
gpt4 key购买 nike

我正在为 Rails 3 项目编写简单的单元测试,但我无法实际执行任何测试。

举个例子,尝试运行 Rails 自动生成的测试失败:

require 'test_helper'

class UserTest < ActiveSupport::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end

导致以下错误:

<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>'

注释掉 require 'test_helper' 行并尝试运行此错误中的测试结果:

user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)

Action 包 gem 似乎已正确安装并且是最新的:

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)

Ruby 的版本为 1.9.2p0,Rails 的版本为 3.0.3。

我的测试目录的示例转储如下:

/fixtures
/functional
/integration
/performance
/unit
-- /helpers
-- user_helper_test.rb
-- user_test.rb
test_helper.rb

我以前从未见过这个问题 - 我已经运行了典型的 rake 任务来准备测试环境。我的应用程序或环境配置文件中没有任何异常,也没有安装任何会干扰测试环境的异常 gem。

编辑 3 月 9 日

Xavier Holt的建议,明确指定 test_helper 的路径有效;然而,这暴露了 ActiveSupport 的一个问题。

现在,当我尝试运行测试时,我收到以下错误消息(如上面所列):

user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)

但是正如您在上面看到的,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!

因此,查看上面列出的文件,我看到以下内容:

#!/usr/bin/env ruby

# Load the test files from the command line.

ARGV.each { |f| load f unless f =~ /^-/ }

据我所知,一切看起来都符合预期。

最佳答案

您的 test/test_helper 文件应该在您生成应用程序时创建。它包含以下有值(value)的内容:

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

这里的第二行是最重要的:它需要应用程序根目录下的 config/environment.rb 文件,而这又需要很多其他东西,包括有值(value)的(我就像今天这个词,好吗?)ActiveSupport 常量。

当您生成 Controller 、模型或脚手架时,它还会为它们生成测试。我刚刚在我的应用程序中运行 rails gscaffold 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

该文件的第一行需要我们刚刚看到的 test/test_helper.rb 文件。这将加载 ActiveSupport 及其中的 TestCase 类,从而使此测试可行。其他一切都从那里开始。

有了所有这些解释(即使这是您已经知道的事情),我打赌它会大量破坏您的LOAD_PATH,从而导致测试 要从中删除的目录。

真正不寻常的是,当您指定 test/test_helper.rb 的完整路径时,您是说它加载了它,但 ActiveSupport 仍然未定义。嗯,应该按照上面的描述加载。它实际上加载了 config/environment.rb 吗?您可以添加一些内容,例如:

puts "LOADING CONFIG/ENVIRONMENT.RB"

config/environment.rb 文件的顶部,然后再次运行测试?应该是输出的。非常不寻常。

继续讨论LOAD_PATH...有一个肮脏的小 secret 没有告诉我们?

事实上,Dan Cheail 提出了一个很好的观点。您可以使用 ruby test/unit/ticket_test.rb 运行测试,在这种情况下 test_helper 将不可用,但这仍然不能解释为什么当您指定完整路径,您仍然会得到未定义的常量ActiveSupport

如果您想运行单个测试,您应该这样做:

ruby -Itest test/unit/ticket_test.rb

那里的 -I 选项将 test 目录添加到加载路径,这意味着 test_helper 文件将通过直接 可用>需要“test_helper”。如果此后仍然出错,我认为您的 test/test_helper.rb 要么是空的,要么是损坏的。

关于unit-testing - 给定一个典型的 Rails 3 环境,为什么我无法执行任何测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5227081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com