Tenho um objeto que estou tentando simular usando o moq. O construtor do objeto possui os parâmetros necessários:
public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider,
ICrmProvider crmProvider,
ICacheProvider cacheProvider) { ... }
}
Agora estou tentando criar a simulação para este objeto usando a sintaxe "setup" v3 ou v4 "Mock.Of" do moq, mas não consigo descobrir isso ... tudo o que estou tentando não está validando. Aqui está o que eu tenho até agora, mas a última linha está me dando um objeto real, não a simulação. Estou fazendo isso porque tenho métodos no CustomerSyncEngine que desejo verificar se estão sendo chamados ...
// 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);
Respostas:
A última linha está fornecendo uma instância real porque você está usando a nova palavra-chave, não zombando de CustomerSyncEngine.
Você deveria usar
Mock.Of<CustomerSyncEngine>()
O único problema com os tipos de simulação de concreto é que o Moq precisaria de um construtor público padrão (sem parâmetros) OU você precisa criar o Moq com a especificação do construtor arg. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html
A melhor coisa a fazer seria clicar com o botão direito na sua classe e escolher Extrair interface.
fonte
CustomerSyncEngine
que só useICrmProvider
com implementações de mocking tradicionais para todas as 3 interfaces, enquanto um contêiner de autmocking permitiria que você fornecesse apenas um.Altere a última linha para
e deve funcionar
fonte
new Mock<CustomerSyncEngine>(new object[]{mockLogger, mockCrm, mockCache}).Object;