ruby-on-rails - 如何在默认 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 5.2 中,默认的测试框架是Minitest 和 Capybara
Minitest gem 自动包含在
rails new
您可以使用块自定义生成器行为
config.generators do
config/application.rb
test_framework
“定义要使用的测试框架。默认为 false,默认情况下将使用 Minitest”
显然,我的理解存在差距,或者我的假设之一是错误的。
重现步骤
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
单元测试和系统测试的参考资料。
我尝试过的其他事情
我尝试了
config.generators
块中的其他设置只是为了确保它正常工作鉴于 test_unit 生成器似乎不可协商,我尝试通过 test_unit 更改生成器;
config.generators.test_framework :test_unit, model: false
我试图禁用其他各种测试;
fixture:false, integration: false, model: false, spec: false, system: false, view: false
我试图确认我没有任何其他可能会弄乱事物的宝石或设置(与旧版本的 FactoryBot/Girl 相关的几个类似的听起来问题)
我尝试了其他答案
generate.test_framework :mini_test
中提到的变体
问题
- 如何控制这些发电机?
- 我应该去哪里(在 Internet 或我的文件系统上)了解可以传递给每个测试框架的生成器的有效选项?
- 为什么我的香草应用程序中的帮助系统说默认测试生成器是 TestUnit 而官方文档说它是 Minitest?
解决方案
我试图根据最近的学习(并基于 Rails 6)部分回答我自己的一些问题(2 年多后)。如果我错了,希望坎宁安定律成立。
1. :test_unit == :minitest (或多或少)
让我感到困惑的第一个大问题是 Minitest 确实是底层的默认测试框架,但 Rails 中的几乎所有东西(仍然?)似乎都是指 TestUnit/test_unit。
示例包括:
rails g model --help
输出(下面的片段)-t, [--test-framework=NAME] # Test framework to be invoked # Default: test_unit ^^^^^^^^^ TestUnit options: ^^^^^^^^
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 ^^^^^^^^^
- 我们生成测试的方式:
bin/rails generate test_unit:model article title:string body:text ^^^^^^^^^
2. 深入测试单元
果然,如果我们查看,all.rb
我们会看到“测试单元”通过test_unit
Railtie包含在内。如果(像我一样)你真的不知道Railtie是什么,请查看这篇博文,我发现它很有帮助。
就我们可以在我们的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 测试指南test_unit:model
也提到test_unit:scaffold
了。当我尝试rails g test_unit:foo
Rails 建议时,也许我的意思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
推荐阅读
- php - 如何使用 INNER JOIN 在 GridView::widget 中显示值
- python - 如何在 python-pptx 中读取数据标签的文本
- reactjs - 使用反应路由器后字体在反应中不起作用
- php - 在自定义类中访问 CakePHP $this
- android - 如何让我的应用出现在其他应用的共享板中 - 例如whatsApp
- javascript - 在运行测试之前如何登录和注销用户
- ios - 为什么我无法从 Xcode 的 Assets.xcassets 文件夹中删除任何对象或文件?
- python - 在不使用 range(len()) 的情况下更改(替换)列表中的值
- javascript - 如何在 React JS 中实时显示时间和日期?
- scala - 为什么将 for 表达式转换为 Double 会导致意外序列?