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


86

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

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

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

답변:


150

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

좋아요, 알겠습니다. 그러나 제기 된 오류 메시지에 대해 주장하는 방법을 여전히 잃어 버렸습니다.
kfitzpatrick

3
err =-> {bar.do_it} .must_raise RuntimeError 구문이 작동하지 않았습니다. 다음 예외가 계속 발생했습니다. NoMethodError : 무기 호에 대한 정의되지 않은 메서드`assert_raises 'NilClass
thanikkal

2
@thanikkal 사용 Minitest::Spec하고 있는지 확인하십시오 Minitest::Test. 예상을 포함한 Spec DSL은 Minitest::Spec.
blowmage

28

예외를 주장하려면 :

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)

8

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

2
Minitest는 오류 메시지 확인을 지원하지 않지만 오류 must_raise인스턴스를 제공하므로 메시지를 직접 확인할 수 있으므로이를 사용하여 수행 할 수 있습니다.
bithavoc 2014 년

1
이 솔루션은 나에게 기분이 좋지만 must_raise이전에 사용하지 않았습니다 .
pumazi

예외가 발생하지 않으면이 솔루션이 실패하지 않을 것이라고 생각합니다. 발생한 예외가 올바른지 확인합니다. 그러나 예외가 발생하지 않으면 어설 션이 수행되지 않습니다 => 오류가 없습니다.
Foton

좋은 점 @Foton 나는 그 기대를 반영하기 위해 대답을 변경했습니다.
개발자

0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.