2016-07-27 3 views
2

assertError() 대 :stopifnot() 나는 <code>stopifnot()</code>과 <code>assertError()</code>의 차이점이 무엇인지 궁금

이 가 assertError() 기본적으로 찾을 수 없습니다 (당신은 먼저 "도구"패키지를로드 할 것이다) 그러나 stopifnot()입니다

.

TRUE 또는 FALSE과 같은 인수를 전달하는 경우에도 assertError()가 항상 오류 메시지를 throw하지만, stopifnot()은 명백하고 예상되는 일을 수행합니다.

설명서 페이지를 읽는 것이 도움이되지 않았습니다. assertError(length(x) != 7) 대신 올바른 용도는 무엇입니까? x이 정의되지 않은 경우 명령문에 오류가 없지만 정의 되 자마자 x 길이와 관계없이 오류가 발생합니다 (7 여부).

+0

나는'assertError()'가 그렇게 생각하지 않는다고 생각합니다. 계산을 수행하는 대신 예상되는 오류를 찾기 위해 코드를 파싱하도록 설계되었으며 구문 분석 오류를 찾지 못하면 실제 오류가 throw됩니다. – Henry

+0

파싱 오류 또는 경고가있을 때 이러한 함수가 오류를 발생시키지 않으십니까?그것은 나에게 이상한 개념처럼 들린다 (나는 C의 주장()으로 자랐다). –

+0

아니요. 'assertError()'는 구문 분석 오류가 없으면 오류를 발생시킵니다. 오류가 있다는 주장입니다 – Henry

답변

3

주요 차이점은 어디에 사용해야하는지입니다.

stopIfnotassertError 코드를 테스트 할 때 실행 중에 일부 조건이 충족되지 않으면 실행을 중지하는 것이 목표입니다.

assertErrorassertError이 표현을 통과 할 때,이 오류가 발생하고 assertError이 조건을 반환

> length(x) != 7 
Error: object 'x' not found 

오류가있어,이 x이 정의되지 않은 때 발생하는 것입니다, 오류가 발생하는 매개 변수의 기대 만났다 (그 자체의 오류). 이를 통해 코드의 실패 사례를 테스트 할 수 있습니다.

그래서 assertError은 테스트 주도형 개발 패턴 (TDD)의 테스트 사례에서 주로 사용되며, 코드/함수가 특정 매개 변수에 대해 오류를 발생시키고 나중에 함수를 업데이트 할 때 오류가 발생하지 않도록해야합니다. 그것.

stopifnot의 사용 및 assertError :이 코드를 실행

tryCatch(
    assertError(mydiv(3,0)), 
    error = function(e) { print("Warning, mydiv accept to divide by 0") } 
) 

: 지금

mydiv <- function(a,b) { 
    stopifnot(b>0) 
    a/b 
} 

그리고 우리가 0으로 "B"를 통과 할 경우 오류가 발생합니다이를 보장하기위한 테스트를 할 수 있습니다 출력, 원하는 동작을 생성하지 않습니다. 우리는이 같은 mydiv에 stopifnot을 언급하는 경우

지금 :

[1] "Warning, mydiv accept to divide by 0" 

이 함수를 테스트의 작은 예는 다음과 같습니다

mydiv <- function(a,b) { 
    #stopifnot(abs(b)>0) 
    a/b 
} 

그리고 다시 tryCatch 블록을 테스트, 우리는이 출력을 얻을 실제로 예상대로 오류가 발생합니다.

tryCatch 블록은 다른 메시지로 보여 주기만하면됩니다. 주제에 대해 더 자세히 알려주 길 바랍니다.

+0

올바른 사용 예를 들려 줄 수 있습니까? 귀하의 설명은 여전히 ​​다소 추상적입니다. –

+0

좋아, 알았다. 아마도 이름과 간략한 설명서가 나를 혼란스럽게 만들었을 것입니다. 어쩌면'assert.IsError()'가 더 나은 이름 일 것입니다. Eiffel과 같은 언어에서 'mydiv'에'require b/= 0'을 추가하여'b == 0' ('b가 아닌 = 0')이라면'mydiv'가 작동하지 않을 것이라는 것을 문서화하고 검사합니다. –