IT

생성자에 매개 변수가있을 때 Moq로 모의

lottoking 2020. 9. 25. 08:18
반응형

생성자에 매개 변수가있을 때 Moq로 모의


moq를 사용하여 조롱하려는 개체가 있습니다. 구독의 생성자에는 필수 변수가 있습니다.

public class CustomerSyncEngine {
    public CustomerSyncEngine(ILoggingProvider loggingProvider, 
                              ICrmProvider crmProvider, 
                              ICacheProvider cacheProvider) { ... }
}

이제 moq v3 "setup"또는 v4 "Mock.Of"구문을 사용하여 만들려고하는 것을 알아낼 수 없습니다. 여기 내가 지금까지 가지고있는 것이 마지막 줄은 모의가 아닌 실제를 제공하는 것입니다. 내가이 작업을 수행하는 이유는 확인하려는 CustomerSyncEngine에 메서드가 호출되기 때문입니다.

// setup
var mockCrm = Mock.Of<ICrmProvider>(x => x.GetPickLists() == crmPickLists);
var mockCache = Mock.Of<ICacheProvider>(x => x.GetPickLists() == cachePickLists);
var mockLogger = Mock.Of<ILoggingProvider>();

// need to mock the following, not create a real class like this...
var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache);

마지막 줄은 CustomerSyncEngine을 조롱하는 것이 아니라 새로운 키워드를 사용하고 있기 때문에 실제 인스턴스를 제공하는 것입니다.

당신은 선호합니다 Mock.Of<CustomerSyncEngine>()

Mocking Concrete 유형의 유일한 문제는 Moq에 공용 기본 생성자 (매개 변수 없음)가 필요하거나 생성자 arg 사양으로 Moq를 선택한다는 것입니다. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

가장 좋은 방법은 클래스를 마우스 오른쪽 버튼으로 클릭하고 인터페이스 추출을 선택하는 것입니다.


마지막 줄을

var syncEngine = new Mock<CustomerSyncEngine>(mockLogger, mockCrm, mockCache).Object;

그리고 작동합니다

참고 URL : https://stackoverflow.com/questions/7414704/mocking-objects-with-moq-when-constructor-has-parameters

반응형