Ho la seguente classe, che utilizza l'iniezione del costruttore:Come chiamare costruttore con argomenti di interfaccia quando beffardo una classe concreta con Moq
public class Service : IService
{
public Service(IRepository repository, IProvider provider) { ... }
}
Per la maggior parte dei metodi di questa classe, ho semplicemente creare Moq schernisce per IRepository
e IProvider
e costruire lo Service
. Tuttavia, esiste un metodo nella classe che chiama diversi altri metodi nella stessa classe. Per testare questo metodo, invece di testare tutti questi metodi insieme, voglio testare che il metodo chiami quei metodi correttamente ed elabori correttamente i loro valori di ritorno.
Il modo migliore per farlo è prendere in giro Service
. Ho preso in giro lezioni concrete con Moq prima senza problemi. Ho persino preso in giro lezioni concrete che richiedono argomenti di costruzione con Moq senza problemi. Tuttavia, questa è la prima volta che ho bisogno di passare gli argomenti in modo fittizio con nel costruttore per un oggetto deriso. Naturalmente, ho provato a farlo in questo modo:
var repository = new Mock<IRepository>();
var provider = new Mock<IProvider>();
var service = new Mock<Service>(repository.Object, provider.Object);
Tuttavia, ciò non funziona. Invece, ottengo il seguente errore:
Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: My.Namespace.Service.
Could not find a constructor that would match given arguments:
Castle.Proxies.IRepository
Castle.Proxies.IProvider
Questo funziona bene se il costruttore Service
s' prende argomenti semplici come int
s e string
s, ma non se ci vuole interfacce che sto beffardi. Come fai a fare questo?
Quale versione di Moq e castello stai usando? Perché il tuo codice di esempio funziona correttamente usando Moq 4.2.1312.1622 e Castle.Core 3.2.2 ... – nemesv