Open3.capture3で取得した標準出力の文字列をMinitestで使ったら、先頭に「# encoding: UTF-8」が入ってくることがあった。
例えば下記のテストは失敗するのだけど、expectedとactualの差分を見るとactualの先頭行が「# encoding: UTF-8」になっている。
# coding: utf-8 require 'minitest' require 'minitest/autorun' require 'open3' class TestCapture3 < MiniTest::Test def test_stdout output, error, status = Open3.capture3("cat -", stdin_data: "") assert_equal "\n", output end end
$ ruby test_capture3.rb Run options: --seed 56761 # Running: F Finished in 0.232475s, 4.3015 runs/s, 4.3015 assertions/s. 1) Failure: TestCapture3#test_stdout [test_capture3.rb:11]: --- expected +++ actual @@ -1,3 +1 @@ -# encoding: UTF-8 -" -" +"" 1 runs, 1 assertions, 1 failures, 0 errors, 0 skips $
上記の場合、expectedを""にすれば何も問題なくテストは成功するものの気持ち悪さが残る。
対処方法を調べたところ、冒頭で外部エンコーディングを明示的に指定することで「# encoding: UTF-8」が入らなくなった。
Encoding.default_external = 'utf-8'
実行環境: ruby 2.6.5p114 (2019-10-01 revision 67812) [x64-mingw32] + minitest (5.11.3)