首页 > 解决方案 > 如何在默认 Rails 中自定义测试生成器?

问题描述

编辑:最初这是一个 Rails 5.2 问题,但它似乎仍然与 Rails 6 和 6.1 相关

我正在尝试自定义在 vanilla Rails 5.2.x 应用程序中默认生成哪些测试。不过,我似乎无法配置 Minitest 生成器。当我尝试生成模型时,我的以下代码config/application.rb会导致错误。error minitest [not found]

config.generators do |generate|
  generate.test_framework :minitest, model: false
end

我的假设/理解

显然,我的理解存在差距,或者我的假设之一是错误的。

重现步骤

rails -v
    # Rails 5.2.1.1
rails new testing-test-frameworks
    # Bundle install outputs: 'Using minitest 5.11.3'
cd testing-test-frameworks
rails g model --help
    # Default [test framework]: test_unit [why???]

rails g model person
    # invoke    test_unit [why???]
    # create      test/models/person_test.rb
    # create      test/fixtures/people.yml

奇怪的是,官方的 Rails 测试指南也有很多invoke test_unit单元测试和系统测试的参考资料。

我尝试过的其他事情

问题

  1. 如何控制这些发电机?
  2. 我应该去哪里(在 Internet 或我的文件系统上)了解可以传递给每个测试框架的生成器的有效选项?
  3. 为什么我的香草应用程序中的帮助系统说默认测试生成器是 TestUnit 而官方文档说它是 Minitest?

标签: ruby-on-railsrubytddminitest

解决方案


我试图根据最近的学习(并基于 Rails 6)部分回答我自己的一些问题(2 年多后)。如果我错了,希望坎宁安定律成立。

1. :test_unit == :minitest (或多或少)

让我感到困惑的第一个大问题是 Minitest 确实是底层的默认测试框架,但 Rails 中的几乎所有东西(仍然?)似乎都是指 TestUnit/test_unit。

示例包括:

  1. rails g model --help输出(下面的片段)
    -t, [--test-framework=NAME]                # Test framework to be invoked
                                               # Default: test_unit
                                                          ^^^^^^^^^
    
    TestUnit options:
    ^^^^^^^^
    
  2. rails g scaffold Example输出(下面的片段):
      create    app/models/example.rb
      invoke    test_unit
                ^^^^^^^^^
      create      test/models/example_test.rb
      invoke  scaffold_controller
      create    app/controllers/examples_controller.rb
      invoke    test_unit
                ^^^^^^^^^
      create      test/controllers/examples_controller_test.rb
      create      app/helpers/examples_helper.rb
      invoke      test_unit
                  ^^^^^^^^^
    
  3. 我们生成测试的方式:
    bin/rails generate test_unit:model article title:string body:text
                       ^^^^^^^^^
    

2. 深入测试单元

果然,如果我们查看,all.rb我们会看到“测试单元”通过test_unitRailtie包含在内。如果(像我一样)你真的不知道Railtie是什么,请查看这篇文,我发现它很有帮助。

就我们可以在我们的config/application.rb config.generators块中提供哪些选项而言,我认为我们可以传递的唯一选项config.generators.test_framework :test_unitfixture: true/false(并且可能指定一个fixture_replacement路径(?),基于test_unit railtie中的明显默认值)。

3. “TestUnit”还能生成什么?

如果您运行rails g以获取可用生成器的列表,则输出中只提到了四个 TestUnit:

TestUnit:
  test_unit:channel
  test_unit:generator
  test_unit:mailbox
  test_unit:plugin

但是Rails 测试指南test_unit:model也提到test_unit:scaffold了。当我尝试rails g test_unit:fooRails 建议时,也许我的意思rails g test_unit:job是这三个“无证”生成器。

据我所知,这三个额外的来自这个 generators 文件夹,还有一些其他的。如果是这样,我认为完整的列表是:

  • test_unit:channel*不在该文件夹中,似乎是由 ActionCable添加的
  • test_unit:controller
  • test_unit:generator
  • test_unit:helper
  • test_unit:integration
  • test_unit:job
  • test_unit:mailbox*不在该文件夹中,似乎是由ActionMailbox添加的
  • test_unit:mailer
  • test_unit:model
  • test_unit:plugin
  • test_unit:scaffold
  • test_unit:system

推荐阅读