어떤 종류의 예외와 함께 RSpec의 should_raise를 사용하는 방법?


211

나는 이런 식으로하고 싶다 :

some_method.should_raise <any kind of exception, I don't care>

어떻게해야합니까?

some_method.should_raise exception

... 작동하지 않습니다.

답변:



88

RSpec 2

expect { some_method }.to raise_error
expect { some_method }.to raise_error(SomeError)
expect { some_method }.to raise_error("oops")
expect { some_method }.to raise_error(/oops/)
expect { some_method }.to raise_error(SomeError, "oops")
expect { some_method }.to raise_error(SomeError, /oops/)
expect { some_method }.to raise_error(...){|e| expect(e.data).to eq "oops" }

# Rspec also offers to_not:
expect { some_method }.to_not raise_error
...

참고 : raise_errorraise_exception교환 할 수있다.

RSpec 1

lambda { some_method }.should raise_error
lambda { some_method }.should raise_error(SomeError)
lambda { some_method }.should raise_error(SomeError, "oops")
lambda { some_method }.should raise_error(SomeError, /oops/)
lambda { some_method }.should raise_error(...){|e| e.data.should == "oops" }

# Rspec also offers should_not:
lambda { some_method }.should_not raise_error
...

참고 : raise_error의 별칭입니다 raise_exception.

설명서 : https://www.relishapp.com/rspec

RSpec 2 :

RSpec 1 :


좋은 대답이었습니다.
Ziggy

raise_error (/ oops /)는 예외 메시지에서 부분 문자열을 확인하는 좋은 방법입니다.
Serge Seletskyy

1
raise_error와 raise_exception이 상호 교환 가능하다는 점을 지적 해 주셔서 감사합니다 (y)
Yo Ludke

85

람다 대신 다음을 사용하십시오.

   expect { some_method }.to raise_error

이는 최신 rspec 버전, 즉 rspec 2.0 이상에 적용됩니다.

자세한 내용은 도코 를 참조하십시오 .


Rspec 1에는 이것을 사용하지 않지만 Rspec 2에는 사용해야합니다.
ericraio

6
실제로 위의 문서 링크에 따르면 {some_method} .to raise_error
Guilherme Garnier

귀하의 의견이나 링크 된 페이지 expect가 왜 보다 나은지 또는 나쁜지 를 설명하지는 않습니다 lambda.
Kragen Javier Sitaker

1
rspec 2.0 이상이 필요합니다. 이것은 람다 구문이 더 이상 작동하지 않기 때문에 어느 것이 더 나은지에 대한 논쟁
Rob

이것은 capybara에서 나를 위해 작동하지 않습니다 :expect { visit welcome_path }.to raise_error
nnyby

65

구문은 최근에 바뀌 었으며 현재는 다음과 같습니다.

expect { ... }.to raise_error(ErrorClass)

4

rspec-expectionsgem의 3.3 버전부터 매개 변수없이 공백 raise_error에 대한 경고가 발생합니다.

expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine

이렇게하면 검사하려는 테스트와 다른 오류로 코드가 실패 할 수 있다는 힌트를 얻을 수 있습니다.

경고 : 사용 raise_error정규 표현을 특정 오류 또는 메시지를 제공하지 않고 이후, 오탐 (false positive) 위험 raise_error루비가 제기 될 때 일치 NoMethodError, NameError또는 ArgumentError잠재적으로 기대도 당신이 전화하고자하는 방법을 실행하지 않고 통과 할 수 있도록. 대신 특정 오류 클래스 또는 메시지를 제공하십시오. 이 메시지는 다음을 설정하여 억제 할 수 있습니다 RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

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