2016-02-24 8 views
7

Z Intellitest można określić typ Intellitest do użycia, który pasuje do interfejsu podczas generowania testów jednostkowych, jednak mam niestandardową fabrykę, której chcę użyć.Jak określić fabrykę Intellitest powinien używać dla interfejsu?

Mam zwyczaj fabryczne:

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

Chciałbym skorzystać z tej fabryki dla wszystkich ILogic przypadkach PEX próbuje stworzyć.

Próbowałem dodając następujący atrybut do PexAssemblyInfo.cs i próbowałem również dodanie go powyżej mojego testu:

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

ale ja wciąż dostać to ostrzeżenie wykonawczego gdy instrumentacji kod:

will use Company.Logics.SpecificLogic as ILogic

I wydaje się, że za każdym razem ignoruje moją fabrykę. Jak mogę zmusić Intellitest do korzystania z mojej fabryki?

Odpowiedz

2

Jeśli chcesz użyć PexCreatableByClassFactory trzeba klasę implementującą IPexClassFactory interfejs. Oto przykład:

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

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

Należy zauważyć, że IPexClassFactory współpracuje z konkretnych klas, a nie z interfejsów. Teraz, jeśli uzna, że ​​Pex instancją Logic klasy powinny być tworzone, następujący kod zostanie wygenerowany:

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

Jeśli wolisz używać PexFactoryMethod jest również możliwe. Jednak PexFactoryMethod współpracuje również z konkretnych klas np:

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

Jeśli używasz obu rozwiązań jednocześnie tj zdefiniować metody fabryki PEX oraz klasy fabrycznej PEX dla tego samego typu, a następnie według mojego doświadczenia fabryki PEX metoda będzie miała wyższy priorytet.

Jeśli masz więcej niż jedną klasę, która implementuje interfejs ILogic, musisz zdefiniować metodę fabryki pex i/lub klasę fabryki pex dla każdej z tych klas. W przeciwnym razie PEX będzie sam próbował tworzyć wystąpienia tych klas.

Jeśli chcesz pozbyć się wspomnianego ostrzeżenia, kliknij je prawym przyciskiem myszy i wybierz opcję Napraw z menu kontekstowego. Pex wygeneruje dla ciebie następujący atrybut:

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

Mówisz, że nie można powiedzieć PEX, aby używał fabryki dla interfejsu bez określania konkretnego typu? –

+0

Nie jestem świadomy tego rodzaju możliwości. Muszę jednak przyznać, że jestem całkiem świeżo z PEX. –

Powiązane problemy