web-dev-qa-db-ja.com

Ruby単体テストで、文字列に特定の部分文字列が含まれていることを表明する方法は?

Ruby単体テスト)で、文字列に部分文字列が含まれているとアサートするにはどうすればよいですか?

assert_contains string_to_test, substring_to_verify
25
Louis Rhys

assert_match pattern, string, [message]string =~ pattern

assert_match substring_to_verify, string_to_test

例えば.

assert_match /foo/, "foobar"

これを頻繁に使用する場合は、独自のアサーションを作成してみませんか?

require 'test/unit'

module Test::Unit::Assertions
  def assert_contains(expected_substring, string, *args)
    assert_match expected_substring, string, *args
  end
end

または、@ IvayloStrandjevで説明されている方法(理解しやすい方法)を使用して、次のように定義できます。

require 'test/unit'

module Test::Unit::Assertions
  def assert_contains(expected_substring, string, *args)
    assert string.include?(expected_substring), *args
  end
end

使用方法は、質問で要求したとおりです。

class TestSimpleNumber < Test::Unit::TestCase
  def test_something
    assert_contains 'foo', 'foobar'
  end

  def test_something_fails
    assert_contains 'x', 'foobar', 'Does not contain x'
  end
end

どちらが生成されます

Run options:

# Running tests:

.F

Finished tests in 0.000815s, 2453.9877 tests/s, 2453.9877 assertions/s.

  1) Failure:
test_something_fails(TestSimpleNumber) [assertion.rb:15]:
Does not contain x

2 tests, 2 assertions, 1 failures, 0 errors, 0 skips

編集する

要求に応じて、自動メッセージを使用して:

module Test::Unit::Assertions
  def assert_contains(exp_substr, obj, msg=nil)
    msg = message(msg) { "Expected #{mu_pp obj} to contain #{mu_pp exp_substr}" }
    assert_respond_to obj, :include?
    assert obj.include?(exp_substr), msg
  end
end

元のassert_matchソース 。これは実際には配列でも機能します!

assert_contains 3, [1,2,3]
35
Patrick Oscity

たとえば、assert string_to_test.include?(string_to_verify)と書くことができます。実行するすべてのチェックにアサートがあるとは期待できないため、ブール条件の従来のチェックに進んでください。

また、使用可能なすべてのアサーションのリストを表示するには、 ここ を参照してください。

有る assert_includes。直感的なものに対して、期待/実際の順序を逆にする必要があることに注意してください。

result = 'foobar'
assert_includes 'foo', result
3
troelskn

私はこれらの1つを使用します:

assert(string_to_test[substring_to_verify])
assert_equal(substring_to_verify, string_to_test[substring_to_verify])

彼らは同じことを成し遂げるので、最初は私の通常の選択です。

2
the Tin Man

assert_matchを使用します:

require 'test/unit'

class MyTest < Test::Unit::TestCase
  def test_match
    assert_match( /aa/, 'xxaaxx')
  end
  def test_match_fail
    #~ assert_match( /aa/, 'xxbbxx')  #fails
  end
end

頻繁に必要な場合は、TestCaseを拡張できます。

require 'test/unit'

module Test
  module Unit
    class TestCase
      #Define new assertion
      def assert_contains(string_to_test, substring_to_verify)
        assert_match( string_to_test, substring_to_verify)
      end
      def assert_not_contains(string_to_test, substring_to_verify)
        assert_not_match( string_to_test, substring_to_verify)
      end
    end
  end
end
class MyTest < Test::Unit::TestCase
  def test_contains()
    assert_contains( /aa/, 'xxaaxx')
    assert_contains( 'aa', 'xxaaxx')
  end
  #~ def test_contains_fail()
    #~ assert_contains( 'aa', 'xxxxxx')
    #~ assert_contains( /aa/, 'xxxxxx')
  #~ end
  #~ def test_contains_not_fail()
    #~ assert_not_contains( /aa/, 'xxaaxx')
    #~ assert_not_contains( 'aa', 'xxaaxx')
  #~ end
  def test_contains_not()
    assert_not_contains( 'aa', 'xxxxxx')
    assert_not_contains( /aa/, 'xxxxxx')
  end
  def test_contains_special_characters()
    assert_contains( '[aa', 'xx[aaxx')
    #~ assert_contains( /[aa/, 'xx[aaxx')
  end
end

備考:

  • 特殊な正規表現文字([] ....など)を使用すると、それを文字列で使用できます(少なくともtest_contains_special_charactersでの実験はうまくいきました)。
  • 独自の正規表現を定義できます。
0
knut

このような:

assert string_to_test.index(substring_to_verify)

.indexメソッドは、部分文字列が見つからない場合にnilを返します。これにより、アサートが失敗します。

0
Whit Kemmey