2017-04-12 4 views
2

함수의 반환 값을 테스트하고 있습니다. 선호하는 방법은 둘 중 어느 것입니까? 테스트를 실행하면 더 자세한 설명 때, 지금, 테스트가 assert 문 및 오류 메시지를 필요로하지 않기 때문에 ExUnit은 어설 션/논박없이 패턴 일치에만 의존합니까?

test "extra verbose, using assert" do 
    {:error, reason} = MyModule.my_fun 
    assert reason == :nope 
end 

test "using pattern matching only" do 
    {:error, :nope} = MyModule.my_fun 
end 

나는 첫 번째를 좋아한다. Otoh, 줄 번호가 MatchError이면 충분합니다.

답변

6

당신은 둘 모두 assert하고보다 설명이 포함 된 오류 메시지 및 코드의 한 라인을 얻을 =assert을 사용할 수 있습니다 : 당신은 좌에 어떤 패턴을 사용할 수 있습니다 ==와 달리

assert {:error, :nope} = MyModule.my_fun 

, 이 경우에는 ===으로 바꿀 수 있습니다. 왜냐하면 LHS가 유효한 패턴과 값이기 때문입니다.

오류가 발생하면 assert없이 패턴 일치를 수행하는 것보다 낫다는 오류 메시지가 표시됩니다 (예 : assert). 정말 = MyModule.my_fun` 테스트 {아니 : 오류} 나를 위해

1) test the truth (MTest) 
    test/m_test.exs:10 
    match (=) failed 
    code: {:error, :nope} = MyModule.my_fun() 
    right: {:error, :nop} 
    stacktrace: 
     test/m_test.exs:11: (test) 
+0

경기에 주장 사용의 주요 단점은 당신이 테스트에서 바로 비교가 – Stuart

+0

결과 대 왼쪽받지 않습니다 것은 어설'인가 아무것도? 패턴이 일치하면, 기본적으로 튜플'{: error, : nope}'가 진실인지 아닌지를 선언 할 것입니다. 패턴이 일치하지 않으면 여전히 'MatchError'가 있습니다. – carp

+1

@ carp nope, 어떤 MatchError도 없을 것입니다. 'assert'는 특별히'='을 처리합니다. 지금 당장 해답에 예제 테스트 실패 결과를 추가했습니다. – Dogbert