2015-11-30 24 views
5

In Visual Studio 2015 ho un progetto di test a cui ho aggiunto un assemblaggio di falsi.Metodo spianato non utilizzato dal test in modalità di rilascio

Nel test unità stessa a creare uno spessore di un metodo generico statico che restituisce un'istanza di tipo generico, ad esempio:

using (ShimsContext.Create()) 
{ 
    ShimStaticClass.TheMethod<MyType>(() => instanceOfMyType); 

    // ... code that uses StaticClass.TheMethod here ... 
} 

Quando la soluzione è costruita in modalità debug test funziona bene e passa. Tuttavia, quando la soluzione viene creata nella modalità di rilascio , la versione ridotta di TheMethod non viene chiamata, causando il fallimento del test.

So che il metodo spessorato non è chiamato perché ho cambiato per generare un'eccezione facendo:

using (ShimsContext.Create()) 
{ 
    ShimForStaticClass.TheMethod<MyType>(() => 
    { 
     throw new InvalidOperationException("Shim was called"); 
    }); 

    // ... code that uses StaticClass.TheMethod here ... 
} 

e questa eccezione non viene generata.

Ho attivato la registrazione diagnostica e la verbosità rumorosa per il falso ma i registri di generazione non indicano alcun problema.

+2

Provare a disattivare le ottimizzazioni in modalità di rilascio, ricostruire e rieseguire i test. È possibile che il compilatore non creda che il metodo debba essere chiamato? – sQuir3l

+0

Quindi, disattivando le ottimizzazioni in modalità di rilascio non ha funzionato per il progetto di test (dove si fa riferimento ai Fakes). Tuttavia, funzionava quando si disattivavano le ottimizzazioni sul progetto che conteneva il codice da testare. La mia presunzione, ora, è che il compilatore sta inserendo la chiamata a "StaticClass.TheMethod ", dato che il codice è in esecuzione come previsto quando viene eseguito utilizzando la build di rilascio. Non penso che la disattivazione delle ottimizzazioni sarà comunque una soluzione valida per questo eseguibile. – Chrisgh

+2

Non è una soluzione, ma potrebbe essere un passo nella giusta direzione. Potresti forse vedere perché pensa che l'invocazione del metodo possa essere saltata e che possibilmente ci sia un miglioramento nel codice che può essere fatto. – sQuir3l

risposta

0

Hai provato a utilizzare l'attributo MethodImpl e il passaggio ImplOptions.NoInlining?

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] 
+0

Sfortunatamente, il metodo che si sta utilizzando è in un gruppo di terze parti. – Chrisgh

+0

Hai provato a completare il metodo e ad usare l'attributo sopra? – Randy

+0

L'ho preso in considerazione, ma non l'ho provato. Se funzionasse, non sarebbe valsa la pena nel mio caso, dato che avrei dovuto aggirare il problema in modo ottuso, quando potevo codificarlo in un modo più diretto (almeno in questo codice, ovviamente ottenendo di più implementazione specifica della mia domanda generica inviata). – Chrisgh