2013-08-15 7 views
8

Ho eseguito il mio codice attraverso la copertura del codice e la riga sottostante mostra 1 blocco come non coperto.Creazione di una nuova istanza di parametro di tipo generico che non ottiene la copertura del codice

Qualcuno può dirmi quale parte di tale linea non è in esecuzione?

enter image description here

un esempio per giocare con:

public abstract class Base 
{ 
    public abstract IExample CreateEntity<TExample>() where TExample : IExample, new(); 
} 

public class Class1 : Base 
{ 
    public override IExample CreateEntity<TExample>() 
    { 
     IExample temp = new TExample(); 
     return temp; 
    } 
} 

public interface IExample 
{ 

} 

public class TEx : IExample 
{ 

} 

e il metodo di prova

[TestMethod] 
    public void TestMethod1() 
    { 
     Class1 ex = new Class1(); 
     ex.CreateEntity<TEx>(); 
    } 
+0

Forse provate a rilasciare 'temp' per renderlo' return new TExample() '? – dasblinkenlight

+1

Il 'info' è referenziato ovunque? – GalacticCowboy

+0

@dasblinkenlight [segnala ancora il 20% di non copertura] (http://i.stack.imgur.com/JXdb8.png) anche se è una riga, strano. –

risposta

6

Modifica il tuo vincolo per forzare il TExample ad essere una classe:

public abstract IExample CreateEntity<TExample>() where TExample : class, IExample, new(); 

Se si esegue il codice compilato attraverso uno strumento come ILSpy, si vedrà il blocco che non sta ottenendo la copertura:

TExample temp = (default(TExample) == null) ? Activator.CreateInstance<TExample>() : default(TExample); 
return temp; 

che sta eseguendo un controllo per vedere se il tipo di passata al generico è stato un tipo di riferimento o un tipo di valore. Forzando di essere una classe, questo controllo verrà rimosso. Per saperne di più sulla parola chiave predefinita qui: http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

Un altro modo per ottenere una copertura codice completo sarebbe quella di utilizzare una struttura che implementa IExample:

public struct S1 : IExample 
{ 
} 

e quindi aggiungere questo test:

[TestMethod] 
public void StructTest() 
{ 
    Class1 ex = new Class1(); 
    ex.CreateEntity<S1>(); 
}