如何在默认的Rails 5.2.x中自定义测试生成器?

时间:2018-11-30 03:43:44

标签: ruby-on-rails ruby tdd minitest

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

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

我的假设/理解

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

复制步骤

test_framework

奇怪的是,official Rails testing guide在单元测试和系统测试中也有很多对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 的引用。

我尝试过的其他事情

  • 我在invoke test_unit块中尝试了其他设置,只是为了确保它能正常工作

  • 鉴于test_unit生成器似乎是不可转让的,我尝试通过test_unit更改世代。 config.generators

  • 我试图禁用其他各种测试; config.generators.test_framework :test_unit, model: false

  • 我试图确认自己没有其他可能会引起混乱的宝石或设置(与旧版本的FactoryBot / Girl有关的几个similar sounding problems

  • 我尝试了其他answers

  • 中提到的fixture:false, integration: false, model: false, spec: false, system: false, view: false之类的变体

问题

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

1 个答案:

答案 0 :(得分:3)

我试图根据最近的学习(并基于 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_unit Railtie 包含“测试单元”。如果(像我一样)您真的不知道 Railtie 是什么,请查看此 blog post,我发现它很有帮助。

就我们可以在 config/application.rb config.generators 块中提供哪些选项而言,我认为我们可以通过 config.generators.test_framework :test_unit 传递的唯一选项是 fixture: 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 Testing Guide 也提到了 test_unit:modeltest_unit:scaffold。当我尝试 rails g test_unit:foo 时,Rails 建议也许我的意思是 rails g test_unit:job 所以这是三个“未记录的”生成器。

据我所知,这三个额外的东西来自this generators folder,以及其他一些。如果是这样,我认为完整的列表是:

  • 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