[ruby] MiniTest의 assert_raises / must_raise에서 예외 메시지를 확인하기위한 예상 구문은 무엇입니까?

MiniTest의 assert_raises/ 에서 예외 메시지를 확인하는 데 예상되는 구문은 무엇입니까 must_raise?

다음과 같은 어설 션을 만들려고 "Foo"합니다. 예상되는 오류 메시지는 어디에 있습니까 ?

proc { bar.do_it }.must_raise RuntimeError.new("Foo")



답변

assert_raises어설 션 또는 must_raise예상을 사용할 수 있습니다 .

it "must raise" do
  assert_raises RuntimeError do
    bar.do_it
  end
  ->     { bar.do_it }.must_raise RuntimeError
  lambda { bar.do_it }.must_raise RuntimeError
  proc   { bar.do_it }.must_raise RuntimeError
end

오류 개체에 대해 무언가를 테스트해야하는 경우 다음과 같이 단언 또는 기대에서 가져올 수 있습니다.

describe "testing the error object" do
  it "as an assertion" do
    err = assert_raises RuntimeError { bar.do_it }
    assert_match /Foo/, err.message
  end

  it "as an exception" do
    err = ->{ bar.do_it }.must_raise RuntimeError
    err.message.must_match /Foo/
  end
end


답변

예외를 주장하려면 :

assert_raises FooError do
  bar.do_it
end

예외 메시지를 주장하려면 :

당으로 API의 문서 , assert_raises등, 당신이 메시지를 확인 할 수 있도록 예외가 일치 반환 속성

exception = assert_raises FooError do
  bar.do_it
end
assert_equal('Foo', exception.message)


답변

Minitest는 (아직) 실제 예외 메시지를 확인하는 방법을 제공하지 않습니다. 하지만이를 수행하는 도우미 메서드를 추가하고 ActiveSupport::TestCase레일 테스트 스위트의 모든 곳에서 사용 하도록 클래스를 확장 할 수 있습니다. 예 : intest_helper.rb

class ActiveSupport::TestCase
  def assert_raises_with_message(exception, msg, &block)
    block.call
  rescue exception => e
    assert_match msg, e.message
  else
    raise "Expected to raise #{exception} w/ message #{msg}, none raised"
  end
end

다음과 같은 테스트에서 사용하십시오.

assert_raises_with_message RuntimeError, 'Foo' do
  code_that_raises_RuntimeError_with_Foo_message
end


답변

좀 더 최근 개발 을 추가 하기 위해 과거에 운이 좋지 않은 미니 테스트 에 추가 하는 것에 대한 논의 가있었습니다 assert_raises_with_message.

현재, 병합을 기다리고 있는 유망한 풀 요청 이 있습니다. 병합되면 assert_raises_with_message직접 정의하지 않고도 사용할 수 있습니다 .

한편, 그 방법을 정확히 정의하는 minitest-bonus-assertions 라는이 편리한 작은 보석이 있습니다.이 방법은 몇 가지 다른 방법과 함께 즉시 사용할 수 있습니다. 자세한 정보 는 문서 를 참조하십시오.


답변