##環境は何?
- Windows10 Home ver.2004
- ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]
- Rails 6.1.0
##何が起きた?
Railsチュートリアルのリスト3.15のrails test
コマンドを実行したら、次のようなエラー①が出た。
D:\Programming\RubyOnRails\sample_app2>rails test
Run options: --seed 42827
# Running:
E
Error:
StaticPagesControllerTest#test_should_get_home:
ActionView::Template::Error: Permission denied @ rb_file_s_rename - (D:/Programming/RubyOnRails/sample_app2/tmp/cache/assets/sprockets/v4.0.0/6p/6p5srKo-CqopTzauMxsxGBdnpUciiPghSY6oKN4-uVY.cache.15640.1380.291914, D:/Programming/RubyOnRails/sample_app2/tmp/cache/assets/sprockets/v4.0.0/6p/6p5srKo-CqopTzauMxsxGBdnpUciiPghSY6oKN4-uVY.cache)
app/views/layouts/application.html.erb:9
test/controllers/static_pages_controller_test.rb:5:in `block in <class:StaticPagesControllerTest>'
rails test test/controllers/static_pages_controller_test.rb:4
.
Finished in 0.148240s, 13.4916 runs/s, 6.7458 assertions/s.
2 runs, 1 assertions, 0 failures, 1 errors, 0 skips
##解決方法は何?
test_helper.rb
内の該当箇所をparallelize(workers: 1)
に変える。
class ActiveSupport::TestCase
# Run tests in parallel with specified workers
parallelize(workers: 1) #ここ
##解決するために何をした?
####1.
エラーメッセージなどで検索して見つけた「Ruby on Rails チュートリアル Windows での実施時の困ったメモ」を参考にコマンドを試してみたが、rails assets:precompile
コマンドで次のようなエラー②が出た。
D:\Programming\RubyOnRails\sample_app2>rails assets:precompile
rails aborted!
Errno::ENOEXEC: Exec format error - D:/Programming/RubyOnRails/sample_app2/bin/yarn --version
Tasks: TOP => assets:precompile => yarn:install
(See full trace by running task with --trace)
rails yarn:install
コマンドを実行してみたり、ある程度長い時間調べてみたりしたが自分の手には負えなさそうなので、このエラー②を解決するのはとりあえず諦めることにした。(bin/yarn
でコマンドを実行しようとしていることが原因……?)
####2.
Permission denied
なんだからアクセス権を付与してやればいいんだろうと思って、エクスプローラーからtmp
フォルダ以下に対して全ユーザー(グループ)にフルコントロールを許可したが、それでもエラー①は直らなかった。
####3.
上と同様、アクセス権の問題ならコマンドを管理者権限で実行すればどうかと思い、「Ruby 管理者として実行」などのキーワードで検索して見つけた「Rubyでgem installしたときにpermission deniedが出現した時の解決法」を参考に、Rubyコマンドプロンプトを管理者として実行してrails test
コマンドを打ってみたが、エラー①は直らなかった。
####4.
2つのtest
の内、片方(should get help
)はassertions
となっていることに気付き、static_pages_controller_test.rb
内のshould get help
をコメントアウトしてshould get home
だけをテストしてみるとエラーは出なかった。つまり、2つのtest
を同時に行うときにだけエラーが出ているということに気付く。
1.で色々調べているときに、Railsのテストはデフォルトだとテスト時間短縮のために並列で行われるというような記述を見かけたことを思い出し、「Rails テスト 並列」などのキーワードで検索して「Rails テスティングガイド」を見つけた。ここの3.1を参考に、test_helper.rb
内の該当箇所をparallelize(workers: 1)
に変えたら、エラー①は出なくなった。
以上