2011-10-18 13 views
5

Stavo tentando di utilizzare FakeItEasy di recente, ma non ero in grado di creare un falso da una classe concreta senza lavorare intorno a molte stranezze.FakeItEasy crea un falso di una classe

ho provato la seguente:

public class MyObject { 
public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

che ha provocato l'un costruttore non trovato con l'accoppiamento arguements eccezione

Poi ho provato:

public class MyObject { 
public MyObject(string temp){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(x => x.WithArgumentsForConstructor(() => new MyObject("temp"))); 

che ha provocato un errore simile.

Infine ho provato:

public class MyObject { 
//public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

che mi ha permesso di creare, infine, il falso. Sono confuso sul motivo per cui la maggior parte degli esempi di falsificazione di una lezione di cemento alludono a questo è più facile che ho trovato che sia? E perché usare il metodo documentato, la prova n. 2 sopra, non ha funzionato?

Esistono alcune limitazioni per simulare una classe concreta che non è documentata?

risposta

0

Non riesco a riprodurre il problema, quando si esegue il codice equivalente funziona per me. Potresti creare una soluzione vs che riproduca il problema e submit an issue on GitHub?

1

Riconosco che questa è una domanda vecchia, quindi sto postando questa risposta per chiunque abbia questo problema e inciampi in questa domanda. Sono stato in grado di replicare un problema simile a questo.

Ho una classe:

public class Service : IService 
{ 
    public Service (int prNum) 
    { 
    //call to a c++ wrapper class (this is where the problem occurs) 
    //some other calls 
    } 
} 

stavo cercando di creare la classe di servizio come un falso per una prova di unità:

private Service fakeServ = A.Fake<Service>((x => x.WithArgumentsForConstructor(() => new Service(3)))); 

che stavo ricevendo lo stesso errore: Constructor non trovato con Argomenti di corrispondenza Eccezione

Alla fine sono entrato nella chiamata A.Fake con il debugger e ho trovato che il codice all'interno del costruttore (che A.Fake chiamava) non riusciva a inizializzare un blocco della memoria globale a causa di Visual Studio non in esecuzione in modalità amministratore. (CreateFileMapping, codice errore 5, System Error 0x5: CreateFileMapping())

Ho impostato Visual Studio per l'esecuzione come amministratore e il problema è stato risolto, il falso creato.

Sembra che il Falso, creato con un costruttore con parametri, attraversi il costruttore (che è quello che speravo di evitare creando un falso poiché la memoria globale non fa parte del focus del mio test unitario, I Dovrò esaminare se c'è un modo diverso in cui dovrei creare questo).

Il codice che hai postato non indica che stai chiamando le classi wrapper o la creazione di memoria globale, ma potresti provare ad entrare nella chiamata di creazione Fake con il debugger per vedere se il costruttore inizia a funzionare e se c'è un errore nel costruttore e quali errori vengono restituiti.

Problemi correlati