2012-01-17 2 views
6

Moq을 사용하면 메서드가 이 아닌Times.Never을 사용하는 특정 인수 (즉, 특정 조건자를 만족하는 인수)로 호출되지 않는지 확인할 수 있습니다.왜 시간이 없습니까? 항상 Moq에 있습니까?

그러나 방법을 확인하는 방법은 몇 번이나 호출되는 메서드는 무엇입니까? 항상은 특정 인수가 필요합니까?

기본값은 Times.AtLeastOnce입니다.

Times.Always이 없습니다. 나는 명백한 것을 놓치고 있는가? 감사!

편집 : 나는 지난 주 Moq 메일 링리스트에 제안을 올렸지 만, 아직 검토 된 것처럼 보이지 않습니다. 나는 어떤 갱신이라도 여기에서 게시 할 것이다.

편집 : 예. XML 문서를 생성하는 클래스를 테스트한다고 가정 해보십시오. 유효한 문서 만 생성되도록하고 싶습니다. 즉, 작성자 종속성이 이고 유효 시퀀스 번호가 지정된 주어진 유효한 문서 만 쓸 수 있는지 테스트하십시오.

should_only_write_valid_xml_documents 

Mock.Get(this.writer).Verify(
    w => w.Write(
     It.Is<XDocument>(doc => XsdValidator.IsValid(doc)), 
     It.Is<int>(n => n < 3)), 
    Times.Always); 
+2

"항상"얼마나 많은 시간을 아는 것을 의미 "항상을 "라고 말하면서 왜 Times (n)을 사용하지 않는지 안다면? – mtijn

+0

아니야, 그게 문제의 핵심이야. 크기가 동적으로 결정되는 루프에서 메서드가 호출되는 것을 상상해보십시오. –

+0

루프 반복 내에서 메서드가 한 번, 반복해서 호출되었는지 확인했습니다. 루프가 테스트 코드에 있다고 가정합니다. 대신 테스트 할 코드에 있다면 테스트 가능성을 재 설계하여 각 메서드 호출을 확인하기 위해 루프 코드에 연결할 수 있습니다. – mtijn

답변

3

"엄격한"모의 동작을 원하는 것처럼 들리는군요. 메서드가 예상되는 매개 변수 이외의 다른 매개 변수로 호출되면 테스트가 실패합니다.

이 MOQ에서 사용할 수 있습니다 :

var mock = new Mock<IFoo>(MockBehavior.Strict); 

(. 예를 Moq QuickStart에서 촬영)

모의에 대한 모든 호출은 이제 해당 Setup이 있어야합니다.

엄격한 모의를 사용하면 취성 시험을하는 경향이 있습니다. 나는이 기술을 피하거나, 최소한 아껴서 사용한다.

+1

물론 - 존재한다면,이 옵션을 사용하면 엄격한 모의로 전환하는 고통과 그것이 수반하는 추가 설정을 피할 수 있습니다. –

8

'몇 번입니까?' Moq은 특정 메서드가 특정 인수로 호출 된 모든 시간을 추적하고 Times.Never, Times.AtLeastOnce 등과 비교할 때이 숫자를 사용합니다.

따라서 메서드가 네 번 실행되고 그것도 '타임즈. 항상 그렇다'는 의미일까요?

Times.Never는 숫자가 0인지 확인하지 않습니다.

Times.AtLeastOnce는 숫자가 1보다 크거나 같은지 확인합니다.

Times.Always는 번호가 ....인지 확인합니다.

당신은 다음과 같이 수행 프로그램 실행 횟수를 결정할 수 :

Times.Exactly(calculatedAmount) 

을하지만 MOQ는 무엇을 '항상'방법을 알 수있는 방법이 없습니다.

+0

이것이 어떻게 가능할 수 있는지 나는 알 수 없습니다. Moq은 "절대적이지 않은"의미를 알고 있습니다. "항상"은 "결코"의 반대입니다. 언급 한 숫자는 0과는 반대로 총 호출 수와 비교됩니다. –

+1

@PeteMontgomery Moq는 0을 의미하기 때문에 "절대로"의미하는 것을 알고 있습니다. "항상"은 양의 정수를 포함 할 수있는 모호한 숫자입니다. 메서드가 호출 될 때마다 테스트를 거쳐 Moq가 호출되기를 바라는 것이 논점입니다. 루프와 같이 여러 번 실행하는 경우 변수를 여러 번 호출하여 호출해야 함을 나타내며 Times.Exactly (numTimesShouldRun)에서 테스트하는 테스트를 실행하십시오. – docmanhattan

+0

흠, 나는 이것이 자기 모순이거나 질문의 ​​요점을 오해하고 있다고 생각합니다. 메소드가 호출 될 때마다 특정 인수로 * 호출되는지 테스트하는 것에 대해 이야기하고 있습니다. 다른 답변을 참조하십시오. –

0

내 권장 사항은 It.IsAny 조건이있는 메소드에 대해 '대체'일치를 만드는 것입니다. 그런 다음 Times를 확인할 수 있습니다. 그 일치는 항상 더 구체적인 일치로 대체되어야합니다.

+0

그 방법을 보여줄 수 있습니까? (Verify to Call은 그것이 의미하는 것이면 "빠져 나오지 않습니다"- 내가 볼 수있는 한 독립적입니다.) 또는 Times를 사용하기 위해 테스트를 다시 작성한다는 의미입니까? 가능한 모든 잘못된 인수를 지정해야하기 때문에 불가능할 수도 있습니다. 건배, 피트. –

2

논리 반전을 적용하여 항상 확인할 수 있습니다.

예 :

의는 다음과 같은 검증을 수행 할 가정 해 봅시다 :

mock.Verify(x => x.Method(It.Is<int>(i => i == 10)), Times.Always()); 

당신이 단순히 그것을 대체 할 수

mock.Verify(x => x.Method(It.Is<int>(i => i != 10)), Times.Never()); 
+0

안녕하세요, 제 질문에 대한 정확한 동기는 예제와 같이 간단한 경우에도이 작업을 수행 할 수 있지만 모든 경우에 수행 할 수는 없다는 것입니다. 예 : 특정 기준을 만족하는 XML 문서로 메소드가 호출되었는지 확인합니다.이러한 기준을 충족시키지 못하는 가능한 모든 XML 문서를 작성할 수 없으므로 Times를 사용하지 않도록 검증을 "반전"할 수 없습니다. –

+0

죄송합니다. 저는이 마지막 지점에서 완전히 잘못되었습니다. 일반적으로 Times가 사용하는 것을 반대로 전환 할 수 있음을 깨달았습니다. 한 번에 하나의 인수 만 테스트하면됩니다. –

관련 문제