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를 깔끔하게 달성한다는 사실에도 불구하고 사이 SetupVerify, 그 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.