Moq에서 Verifiable ()의 목적은 무엇입니까?


125

의 목적은 Verifiable()무엇입니까?

a를 확인하고 Mock이것을 생략해도 SetUp.

편집 : 나는 VerifyAll()모든 것이 확인되는 이유를 사용 하고 있었습니다 . Verify()내 .Verifiable() SetUps로 변경 한 후 확인되었습니다.

답변:


83

부록 : 다른 답변에서 언급했듯이의 목적 .Verifiable은를 통해 트리거 될 수있는 Setup"지연된 Verify(...)통화" 집합 에을 참여시키는 것 mock.Verify()입니다.

OP의 설명을 통해 이것이 목표 였고 유일한 문제는 작동하지 않는 이유를 파악하는 것이었지만 @Liam이 자극 한 것처럼 대답은 실제로 이것에도 영향을 미쳤습니다 .- 내가 할 수있는 한 주요 사용 사례 참조 :

  • a mock.Setup()와 사이의 건조도 유지mock.Verify
  • 실제 Verify호출 자체 에서 확인 구성을 분리 할 수 ​​있도록 허용 (예 : 다른 도우미 메서드에서 설정할 수 있음)

... 그리고 내 대답으로 돌아가서 간결하게 효과적으로 "위의 전문가들은 일반적으로 그러한 목표를 달성하는 것이 그러한 구조에 너무 많이 의존하는 테스트의 가독성 및 유지 관리성에 미치는 영향에 의해 더 중요하다고 간주되기 때문에주의하십시오"라고 말합니다.

ORIGINAL : 가능한 경우 대신 AAA 레이아웃을 따라야 하므로 작업이 완료된 후 또는 가능한 한 쌍을 이루는 것보다 명시적인 mock.Verify( expression )호출을 수행mock.Setup( ... ).Verifiable()mock.Verify()mock.VerifyAll() 해야합니다 (크레딧 : @kzu ).


7
@EricSmith 되돌아 보면, 내가 충분히 강하게 넣었다고 생각하지 않습니다. Arrange 및 Assert 단계 사이의 공통점에 과도하게 집중하는 것보다 작업을 AAA 번들로 분할하면 훨씬 더 많은 이점이 있습니다. 90 %의 경우 마지막에 Verify 호출을 표현하는 방법의 뉘앙스에서 얻을 수있는 것이 있으므로 어떤 경우에는 고통스러운 중복처럼 보이더라도이를 최적화하는 데 많은 시간을 투자해야합니다. manning.com/osherove 가 매우 잘하는 점 중 하나는 누군가 뛰어 드는 테스트를 이해하는 것이 중요하다는 것입니다.
— Ruben Bartelink 2012

3
난 안 일반적으로 하나가 허용 지혜의 성미에 가야하지만 아직 대 AAA의 혜택을 납득하고 있어요 Verifyable()/ VerifyAll()모든 경우입니다. 내 현재 단위 테스트에 많은 Setup(...)호출이 있습니다 (> 30). 관례를 충족시키기 위해 각각을 동등한 Verify ()와 일치시킬 수 있지만 이로 인해 많은 양의 코드 중복이 발생하고 단위 테스트 수가 증가함에 따라 유지 관리 및 읽기가 까다로울 것입니다. 내가 정말로 묻는 것은 많은 설정이 있거나 엄격 Verifiable()하고 빠른 규칙을 피하는 경우 예외를 만들 수 있습니까?
— Steve Chambers

5
@SteveChambers AAA의 핵심 요소는 A *가 아니라는 것입니다. 하나의 Act와 하나의 Assert가 있어야합니다. 따라서 코드가 적다고 말하는 것은 기술적으로 정확하지만 어떤 설정이 어떤 (sub) Acts와 (sub) Asserts에 적용되는지의 우연은 변함없이 지뢰밭이 될 것입니다. 그렇기 때문에 어렵고 빠르지는 않지만 50:50에 가깝다고 제안하는 것은 매우 나쁜 조언입니다. (또한 명확한 테스트의 또 다른 요소 인 Act- 동안 특정 동작을 도입하려고하지 않는 한 확인을 수행하기 위해 설정을 수행 할 필요가 없습니다.)
— Ruben Bartelink

1
@Liam 그리고 그것이 당신의 직업에 적합한 도구라고 확신 하는 것은 정말로 괜찮습니다. 제 진짜 요점은 그것이 모의로 테스트를 작성하는 일반적인 접근 방식으로 눈살을 찌푸리고 있다는 것입니다. 즉, DRYness를 깔끔하게 달성한다는 사실에도 불구하고 사이 Setup와 Verify, 그 AAA에서 제안하는 방식으로 높은 승리를 달성 할 수있는 유일한 휴식 할 수 건조 제약 강하게 암시 전략의 가족이 없을 수 있습니다
— 루벤 Bartelink

1
@Liam 찌르는 것에 감사드립니다. 나는 당신이 말하는 요점에서 정확하기 때문에 내 대답을 업데이트했습니다. 내가 이와 같은 질문에 대답했을 때, 내 견해는 일반적으로 원자 적 대답을 간결하게 진술 한 다음 다른 대답과 같은 경쟁 대답이지도를 채우도록하는 것이었다. 요즘 (여전히 질문에 대답하는 데 시간이 걸린다면) 이것이 첫 번째 사례가 된 더 완전한 대답을 제공하려고 할 것입니다.
— Ruben Bartelink

54

Verify()테스트가 끝날 때 메서드가 호출 될 때 확인 가능으로 표시된 기대 값이 호출되지 않은 경우 예외는 thrown.

VerifyAll() 검증 가능한 기대치를 확인하지 않습니다.


VerifyAll ()이 검증 가능한 기대치를 확인하지 않는 것에 대해 조금 더 설명해 주시겠습니까?
— JW

@JW 이는 VerifyAll이 검증 가능한 기대치로 표시되었는지 여부를 고려하지 않고 모든 설정을 검증한다는 것을 의미합니다.
— phoog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.