4

我想用现有的 Rails 2.3.14 应用程序尝试 minitest。我已经尝试了几种方法,但它们似乎都不起作用。

它基本上归结为这一点。当我将 minitest 添加到 Gemfile 时,我运行的所有测试bundle exec rake test都不会使用 minitest 执行。

问题是大多数测试用例扩展了 ActiveSupport::Testcase 或 ActionController::Testcase(扩展了 ActiveSupport::TestCase)。

通过查看此类的代码,我发现它已经(不知何故)支持 MiniTest:

class TestCase < ::Test::Unit::TestCase
    if defined? MiniTest
      Assertion = MiniTest::Assertion
      alias_method :method_name, :name if method_defined? :name
      alias_method :method_name, :__name__ if method_defined? :__name__
    else
...
end

(完整代码见https://github.com/rails/rails/blob/2-3-stable/activesupport/lib/active_support/test_case.rb )

我的问题是:

是否可以在 Rails 2.3 中使用 minitest 而不是 test::unit 而无需扩展 (MiniTest::Unit::TestCase)

4

1 回答 1

2

任何测试框架都由两部分组成,定义和运行测试的方法(称为测试运行器)和断言框架。

查看 ActiveSupport 似乎如果 MiniTest 被定义,运行 rails 单元测试运行器将默认使用 MiniTest 的断言类。这意味着您可以使用 Minitest 的断言语法。

定义 MiniTest 应该只是需要 'minitest\unit' 的情况。

但是,如果您想使用运行器,则需要从 MniTest 框架测试夹具基类派生。

在railscasts中有一步一步的演练,用于自己设置。

它归结为:

  1. 从你的 config/applications.rb 中删除 test_unit
  2. 将 minitest gem 添加到您的 gem 文件“Gemfile”
  3. 在可以包含在测试中的帮助文件中设置环境
  4. 添加一个 rake 任务来运行测试。(/lib/tasks/minitest.rake)

Railscasts有详细信息。

如果您不想更改现有测试来执行此操作..那么您必须修改 Test::Unit 以将 TestCase 重新定义为选择的 MiniTest 基类或派生自一个的东西。这是这个 gem采用的方法,可能会给你一些关于如何最好地去做的想法。

另一种解决方案是通过代码进行搜索/替换以切换测试用例的基类。

我希望这有帮助。


我更新了我的答案并将以下内容删除为过时:

minitest-rails 已被正确指出,因为它仅适用于 Rails 3.1。

这颗宝石似乎很旧(2009 年 3 月 26 日),但它可能会有所帮助。如果您需要提示来做类似的事情,请检查源代码。

于 2012-06-03T09:24:39.770 回答