运行 测试安装在主机应用程序中时位于 Rails 引擎中

Run tests located in a Rails Engine when mounted in host application

我在名为“Blorgh”的引擎中进行了一些测试。我只是在引擎存储库的根目录中通过 运行 以下命令测试我的引擎。

rails test
...
19 runs, 8 assertions, 0 failures, 0 errors, 11 skips

简单。现在,Blorgh 已安装在应用程序中。

gem blorgh

此应用是使用包含测试步骤的管道部署的。我希望测试步骤执行已安装引擎的测试,以便管道在发现 Blorgh 引擎中的测试有问题时停止部署。

问题是当rails test在宿主应用程序的根目录中执行时,它只查找特定于宿主应用程序的测试。

0 runs, 0 assertions, 0 failures, 0 errors, 0 skips

我如何在我的 Blorgh 引擎安装后执行测试?我搜索过高低。我愿意通过爬行 Blorgh::Engine.root 来完成我自己的任务,但我什至不确定 rails test 在幕后做了什么。

如果必须的话,您可以设置一个 rake 任务来只加载您需要的测试。主应用程序“测试”目录应该在您的加载路径中,因为 test/test_helper.rb 加载环境。

# lib/tasks/run_engine_tests.rake

task :run_engine_tests do
  # Add main app `test` directory to load path
  # This means requires such as `require "test_helper"` will load main app 
  #   helper instead of engine helper. That's what we need to run the tests
  #   under our app, because engine's `test_helper.rb` loads dummy app.
  $LOAD_PATH << Rails.root.join("test").to_s

  # require tests from the engine that you need to run
  Dir.glob(Blorgh::Engine.root.join("test/**/*_test.rb")).each { |f| require f }
  
  # rails magic does the rest
  require "active_support/testing/autorun"
end

并进行快速测试

$ RAILS_ENV=test bin/rails run_engine_tests
Running 1 tests in a single process (parallelization threshold is 50)
Run options: --seed 12153

# Running:

hello from Blorgh
.

Finished in 0.004990s, 200.4139 runs/s, 200.4139 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

使用RAILS_ENV=test否则会加载测试环境两次。

作为参考,看看这些

https://github.com/rails/rails/blob/v7.0.2.3/railties/lib/rails/commands/test/test_command.rb#L29

https://github.com/rails/rails/blob/v7.0.2.3/railties/lib/rails/test_unit/runner.rb#L39