2012-02-07 2 views
1

저장소에 대한 호출을 조롱하려고합니다. 저장소 호출 설정()를 사용하여 값을 반환 할 때 나는 성공적으로 수행 할 수 있습니다 반환 값 :. 그러나Moq : 값을 반환하지 않는 메소드를 설정하십시오.

mock.Setup(m => m.Get(param)).Returns(new CustomObject()); 

를, 내가 어떤 값을 반환하지 저장소 통화 설정 같은 종류의 작업을 수행 할 때, MOQ가를 던졌습니다

mock.Setup(m => m.UpdateRepository(param1)); // UpdateRepository returns no value 
service.DoUpdate(param1); 
mock.Verify(m => m.UpdateRepository(param1), Times.Exactly(1)); 

주 : DoUpdate 방법은 저장소 호출에만 예외는 0 번 정확하게, 나는이 일을 해요

를이 방법은 모의에 ieExpected 호출 정확히 1 회 호출되지 않았다 저에게 말한다, 그러나이었다. UpdateRepository (param1);

이 경우 Moq 설정을 올바르게 사용하지 않습니까? 값을 반환하지 않는 설치 방법에 대한 다른 방법이 있습니까?

미리 감사드립니다. 검증 가능한 사용

+1

있습니까? –

답변

0

시도 :

mock.Setup(m => m.UpdateRepository(param1)).Verifiable(); 
+0

나는 Mock을보고 있지 않습니다. Intellisense를 통해 기대하십니까? (Moq 4를 사용하고 있습니다.) – TeeZee

+0

@TeeZee 설정을 시도하십시오 –

3

당신은 설정에 UpdateRepository에 대한 호출이 필요하지 않습니다. 그냥 확인해.

을 감안할 때 이러한 유형 :

public interface IRepository 
{ 
    void UpdateRepository(string value); 
} 

public class Service 
{ 
    public Service(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public void DoUpdate(string value) 
    { 
     _repository.UpdateRepository(value); 
    } 

    private IRepository _repository; 
} 

는 다음과 같이 시험 방법이 될 수있다 : 당신은 DoUpdate 실제로 UpdateRepository를 호출해야

const string param1 = "whatever"; 

var repoMock = new Mock<IRepository>(); 

var sut = new Service(repoMock.Object); 

sut.DoUpdate(param1); 

repoMock.Verify(x => x.UpdateRepository(param1), Times.Once()); 
+0

최상의 답변 IMO! 어떤 경우에는 호출 전에 'Verify.Never()'호출을하지 않아도되는지 확인하는 것이 좋습니다. 이는 메서드가 호출되도록하는 데 유용합니다. – ForceMagic

+0

@ForceMagic'Never()'가 유용 할 수 있습니다. 너무 엄격한 조롱에 대해 신중해야합니다. 깨지기 쉬운 테스트를 중단하지 않고 구현을 리팩토링 할 수있는 자유를 원합니다. 즉, 테스트중인 특정 동작 만 확인하십시오. – TrueWill

관련 문제