2016-02-24 89 views
7

Con Intellitest è possibile specificare un tipo per Intellitest da utilizzare che si adatta a un'interfaccia durante la generazione di test di unità, tuttavia ho una fabbrica personalizzata che desidero utilizzare al suo posto.Come posso specificare che Intellitest deve essere utilizzato per un'interfaccia?

mia fabbrica su misura:

public static partial class LogicFactory 
{ 
    /// <summary>A factory for ILogic instances</summary> 
    [PexFactoryMethod(typeof(ILogic))] 
    public static ILogic Create(string defaultUICulture, bool saveSuccessful) 
    { 
     return Mock.Of<ILogic>(
     x => 
     x.GetUICulture(It.IsAny<string>()) == defaultUICulture && 
     x.Save(It.IsAny<string>(), It.IsAny<string>()) == saveSuccessful); 
    } 
} 

Vorrei utilizzare questa fabbrica per tutte le istanze ILogic PEX cerca di creare.

Ho provato ad aggiungere il seguente attributo al PexAssemblyInfo.cs, e ho anche provato ad aggiungere sopra il mio test:

[assembly: PexCreatableByClassFactory(typeof(ILogic), typeof(LogicFactory))] 

ma ho ancora questo avvertimento runtime quando la strumentazione di codice:

will use Company.Logics.SpecificLogic as ILogic

E così sembra che stia ignorando la mia fabbrica ogni volta. Come posso costringere Intellitest a usare la mia fabbrica invece?

risposta

2

Se si desidera utilizzare PexCreatableByClassFactory hai bisogno di una classe che implementa l'interfaccia IPexClassFactory. Ecco un esempio:

public partial class LogicFactory : IPexClassFactory<Logic> 
{ 
    public Logic Create() 
    { 
     //... 
    } 
} 

[assembly: PexCreatableByClassFactory(typeof(Logic), typeof(LogicFactory))] 

Va notato che IPexClassFactory funziona con classi concrete e non con le interfacce. Ora, se Pex decide che deve essere creato un'istanza della classe Logic, il seguente codice verrà generato:

LogicFactory2 s2 = new LogicFactory(); 
Logic s1 = ((IPexClassFactory<Logic>)s2).Create(); 

Se si preferisce utilizzare PexFactoryMethod è anche possibile. Tuttavia, PexFactoryMethod funziona anche con classi concrete Es:

[PexFactoryMethod(typeof(Logic))] 
public static Logic Create(string defaultUICulture, bool saveSuccessful) 
{ 
     //... 
} 

Se si utilizzano entrambe le soluzioni allo stesso tempo vale a dire definire un metodo pex fabbrica e una classe PEX fabbrica per lo stesso tipo, quindi secondo la mia esperienza una fabbrica pex il metodo avrà una priorità più alta.

Se si dispone di più di una classe che implementa l'interfaccia ILogic, è necessario definire un metodo factory pex e/o una classe factory pex per ciascuna di queste classi. In caso contrario, PEX tenterà di creare istanze di queste classi da solo.

Se si desidera eliminare l'avviso indicato, fare clic con il pulsante destro del mouse e selezionare Correzione da un menu di scelta rapida. Pex genererà il seguente attributo per voi:

[assembly: PexUseType(typeof(SpecificLogic))] 
+0

Quindi stai dicendo che non è possibile dire PEX di utilizzare una fabbrica per un'interfaccia senza specificare un tipo concreto? –

+0

Non sono a conoscenza di questo tipo di possibilità. Tuttavia, devo ammettere che sono abbastanza fresco con PEX. –