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을 조롱하는 것이 아니라 new 키워드를 사용하고 있기 때문에 실제 인스턴스를 제공하는 것입니다.
당신은 사용해야합니다 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;
그리고 그것은 작동합니다