2011-12-15 4 views
3

레이크 작업에서 오류를 발생시키기 위해 어설 션을 사용하고 싶습니다.루비에서 assert를 사용하는 것이 가장 좋은 방법이지만 단위 테스트의 일부로는 사용하지 않는 것이 좋습니다.

the_index = items.index(some_item) 
assert_not_nil the_index, "Lookup failed for the following item: " + some_item 

나는 undefined method assert_not_nil을 얻습니다. 내 레이크 작업에 어서션 파일을 포함시킬 수 있습니까? 방법?

이 방법이 가장 좋으며 더 좋은 방법이 있습니까?

Ruby 1.9.2에서 작업.

+1

단위 테스트 및 예외 처리는 매우 다른 두 가지 작업입니다. –

답변

3

가 내장 #[] 같은 역할을 대신 요소가 발견되지 않는 경우 전무를 반환하는 IndexError를 제기 Array#fetch 방법. (해시에도 동일하게 적용됩니다.) 콜렉션이 요소를 제외시키지 않는다면 항상 첫 번째 것을 사용합니다.

raise "I don't expect this to be nil!" if element.nil? 

그러나, 당신은 당신의 코드를 만드는 멀리 실패 할 것이라는 점을 알고있다 만, 종종이 일을해서는 안 : Bramha Ghosh는 알처럼

a = [:foo, :bar] 
a.fetch(0) #=> :foo 
a[4]   #=> nil 
a.fetch(4) #=> IndexError: index 4 outside of array bounds: -2...2 

그리고 다른 경우에 대한

예외에게 자신을 인상 고통스러운 디버깅.

1

어설 션을 사용해야하는 특별한 이유가 있습니까?

raise IndexError, "Lookup failed for the following item: #{some_item}" unless items.include? some_item 
+0

단위 테스트처럼 보입니다. 그것은 더 쉽게 읽을 수 있습니다. –

5

원하는 곳에 실제로 어설 션을 사용할 수 있습니다.

require "minitest/unit" 
include MiniTest::Assertions # all assertions are in this module 
refute_nil @ivar, "An instance variable should not be nil here!" 

하지만 그 이유는 무엇입니까? 의미있는 예외를 직접 제기하십시오.