Подтвердить что ты не робот

Смещение объектов с помощью 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);
4b9b3361

Ответ 1

Последняя строка дает вам реальный экземпляр, потому что вы используете новое ключевое слово, а не издевательское CustomerSyncEngine.

Вы должны использовать Mock.Of<CustomerSyncEngine>()

Единственная проблема с типами Mocking Concrete заключается в том, что Moq понадобится публичный конструктор по умолчанию (без параметров) ИЛИ вам нужно создать спецификацию Moq с конструктором arg. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

Лучшее, что вам нужно сделать, это щелкнуть правой кнопкой мыши по вашему классу и выбрать интерфейс Extract.

Ответ 2

Измените последнюю строку на

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

и он должен работать