2012-08-13 4 views
3

moq를 사용할 때 이상한 점이 있습니다.MOQ가 유효하지 않음 void

하나의 프로젝트에서 메소드가 호출되었다는 것을 검증하려고 시도 할 때 그것이 아니라고 말합니다. 테스트를 디버깅 할 때 메소드를 명확하게 호출합니다.

캐시에 항목을 추가할지 여부를 알려주는 간단한 캐시 개체입니다. 나는 (다른 사람들과 함께) Add, Contains, Get 메소드를 가지고있다.

이러한 방법에 좋은 작품을 확인 내 :

bool Contains(string key); 
T Get<T>(string key); 

하지만이에를 :

mockedCache.Verify(p => p.Add(LOCATION_CACHE_KEY, locations, policy), Times.Once()); 
: 나는 정확한 값을 오순절 시도

void Add(string key, object objectToCache, CacheItemPolicy policy); 

나는이 같은 방법으로 제공

사용 중 .IsAny

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), 
    It.IsAny<CacheItemPolicy>()), Times.Once()); 

아무리 내가 시도해도 0 번 호출 된 응답을 얻습니다.

전에이 동작을 본 적이 없습니다. 아무도 나에게 뭐가 잘못 됐는지 말해 줄 수 있니?

감사

마이클

업데이트 : @SergRogovtsev 제안으로 , 내가 생성 된 출력 MOQ 보았다. 하지 IEnumerable을 함께하지만, MOQ는 전달 된 매개 변수의 정확한 유형을 확인하지 않습니다 보았 듯이 목록

+0

Moq는 어설 션 메시지에서 호출 된 것을 쓰는 경향이 있습니다. 무엇이라고 불렀습니까? 또한 'Times'없이 시도해 보셨습니까? –

+1

확인시 ... 오타입니다? 'It.IsAny '. 그것은'It.IsAny ()'이어야합니다. –

+2

코드가 잘못되어 추가가 호출되지 않았다고 생각 했습니까? – cadrell0

답변

0

호출

내 방법 whas뿐만 아니라 그들은 당신이 주장하는 유형에서 파생있다. 당신이 그 기능을 원하는 경우이 같은 것을 사용해야합니다 : 그렇지 않으면

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.Is<object>(o => o is IEnumerable<string>), It.IsAny<CacheItemPolicy>()), Times.Once()); 

당신이 MOQ의 업데이트 된 버전을 받고 들여다 수를 - 내가 (주장에 It.IsAny<IEnumerable<string>>를 사용) 원래 시나리오를 테스트 한 제대로 작동 Moq v4.0 포함)

0

CacheItemPolicy은 인터페이스를 구현합니까? 그렇다면

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), It.IsAny<ICacheItemPolicy>()), Times.Once()); 

또는 인터페이스 이름이 무엇이든간에 통화를 확인 하시겠습니까?

나는 동일한 문제가있었습니다. 문제는 내 SUT 메소드가 인터페이스를 받았으며 이것이 조롱 된 객체에 전달 된 이유입니다. 클래스가 인터페이스를 구현할 수도 있지만 인터페이스는 여전히 다른 유형입니다. 희망이 도움이됩니다.

관련 문제