A Micro Toolbox

ソフトウェアのニッチな問題の対処記録です

MinitestでOpen3.capture3の出力先頭に「# encoding: UTF-8」が入る

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)