ruby - 改行 - review 改ページ




ルビ字下げされた複数行の文字列 (3)

この質問にはすでに答えがあります。

それはベストプラクティスの質問です。 それをするための明白な方法があります、それらのどれもちょうどちょうど正しいとは思えません。

かなり頻繁に私はある複数行のストリングが作り出されることをテストする必要があります。 これは通常、インデントを壊してすべてを混乱のように見せます。

class TestHelloWorld < Test::Unit::TestCase
  def test_hello
    assert_equal <<EOS, hello_world
Hello, world!
  World greets you
EOS
  end
end

<<-ここでdocマーカーをインデントすることができますが、heredocの内側でインデントを取り除くことはできません、それでもまだひどいようです。

class TestHelloWorld < Test::Unit::TestCase
  def test_hello
    assert_equal <<-EOS, hello_world
Hello, world!
  World greets you
    EOS
  end
end

これは私をインデントさせますが、テストラインの読みやすさが損なわれます。 このgsub本当にここでは感じません。

class TestHelloWorld < Test::Unit::TestCase
  def test_hello
    assert_equal <<-EOS.gsub(/^ {6}/, ""), hello_world
      Hello, world!
        World greets you
    EOS
  end
end

このような複数行の文字列をテストするための本当に読みやすい方法はありますか?


Railsアプリケーションを構築している場合は、 strip_heredocを使用してみてstrip_heredoc 。そうでない場合は、active_supportコア拡張機能が常に必要になる可能性があります。

あなたの例は次のようになります。

require 'active_support/core_ext'

class TestHelloWorld < Test::Unit::TestCase
  def test_hello
    assert_equal <<-EOS.strip_heredoc, hello_world
      Hello, world!
        World greets you
    EOS
  end
end

実際にそれらを含めたくない場合は、次のコードをactive_supportからコピーし、フォーマットの処理方法の例を示します。

class String
  def try(*a, &b)
    if a.empty? && block_given?
      yield self
    else
      __send__(*a, &b)
    end
  end

  def strip_heredoc
    indent = scan(/^[ \t]*(?=\S)/).min.try(:size) || 0
    gsub(/^[ \t]{#{indent}}/, '')
  end
end

これらのどれもが「ベストプラクティス」と呼ばれる可能性があるかどうかはわかりませんが、4つの可能性があります

class Hello

  def self.world
"Hello, world!
  World greets you
"
  end
end

require 'test/unit'

class TestHelloWorld < Test::Unit::TestCase

#Define a constant array of multiline strings and test against the array
# see test_hello_4 
# Alternatively store the multi-line strings in a Yaml fixture file and load 
# them into a constant Hash or Array within a setup method
MLINE = [
"Hello, world!
  World greets you
",
"Another multi line string",
  ]

  # Create a method to return the string
  def test_hello_1
    assert_equal Hello.world, hello_world_string()
  end

  # Create the string using embedded newlines
  def test_hello_2
    assert_equal Hello.world, "Hello, world!\n  World greets you\n"
  end

  # if you only have 1 in the test then put it in a DATA section
  def test_hello_3
    assert_equal Hello.world, DATA.read
  end

  def test_hello_4
    assert_equal Hello.world, MLINE[0]
  end

  def hello_world_string
"Hello, world!
  World greets you
"
  end
end

__END__
Hello, world!
  World greets you

すべて合格

Loaded suite test_hello_world
Started
....
Finished in 0.00083 seconds.

4 tests, 4 assertions, 0 failures, 0 errors

文字列が非常に長い場合を除き、改行文字を埋め込んだ文字列(方法2)を個人的に好みます。その場合は、DATAセクションを使用します。


個人的には、Rubyのインデントされたheredocsは役に立たないと思いますし、それらはBashのインデントされたheredocsのように動作し、文字列のの空白も取り除かなければなりません…

とにかく、この状況に対処しようとするいくつかのライブラリがあります。 この問題を解決しようとするライブラリはたくさんあります。





code-formatting