2016-02-24 11 views
7

Mit Intellitest können Sie einen Typ angeben, den Intellitest verwenden soll, der für eine Schnittstelle beim Generieren von Komponententests passt. Ich habe jedoch eine benutzerdefinierte Factory, die ich stattdessen verwenden möchte.Wie lege ich die Fabrik fest, die Intellitest für eine Schnittstelle verwenden soll?

Meine individuelle Fabrik:

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); 
    } 
} 

Ich mag würde diese Fabrik verwenden für alle ILogic Instanzen PEX zu schaffen versucht.

Ich habe versucht, das folgende Attribut zu PexAssemblyInfo.cs Hinzufügen und ich habe auch versucht, es über meinem Test ergänzt:

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

aber ich habe noch diese Laufzeit Warnung erhalten, wenn Code instrumentiert:

will use Company.Logics.SpecificLogic as ILogic

Und so scheint es, dass es meine Fabrik jedes Mal ignoriert. Wie kann ich Intellitest stattdessen zwingen, meine Fabrik zu benutzen?

Antwort

2

Wenn Sie PexCreatableByClassFactory verwenden möchten Sie eine Klasse benötigen, die IPexClassFactory Schnittstelle implementiert. Hier ein Beispiel:

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

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

Es sollte beachtet werden, dass IPexClassFactory mit konkreten Klassen arbeitet und nicht mit Schnittstellen. Nun, wenn Pex entscheidet, dass eine Instanz von Logic Klasse erstellt werden soll, wird der folgende Code generiert werden:

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

Wenn Sie es vorziehen PexFactoryMethod zu verwenden es auch möglich ist. Allerdings PexFactoryMethod arbeitet auch mit konkreten Klassen zB:

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

Wenn Sie beiden Lösungen zur gleichen Zeit verwenden, dh eine PEX-Factory-Methode und eine PEX-Factory-Klasse für den gleichen Typen definieren, dann nach meiner Erfahrung einer PEX-Fabrik Methode wird eine höhere Priorität haben.

Wenn Sie mehr als eine Klasse haben, die die Schnittstelle ILogic implementiert, müssen Sie für jede dieser Klassen eine pex factory-Methode und/oder eine pex factory-Klasse definieren. Andernfalls wird PEX versuchen, Instanzen dieser Klassen selbst zu erstellen.

Wenn Sie die erwähnte Warnung loswerden wollen, klicken Sie mit der rechten Maustaste darauf und wählen Sie Fix aus einem Kontextmenü. Pex wird das folgende Attribut für Sie zu generieren:

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

Sie sind also sagen, dass es nicht möglich ist, PEX zu anweisen, eine Fabrik für eine Schnittstelle zu verwenden, ohne eine konkrete Art anzugeben? –

+0

Ich bin mir dieser Möglichkeit nicht bewusst. Allerdings muss ich zugeben, dass ich mit PEX ziemlich frisch bin. –