2016-02-24 11 views
7

С Intellitest вы можете указать тип Intellitest для использования, который соответствует интерфейсу при генерации модульных тестов, однако у меня есть специальная фабрика, которую я хочу использовать вместо этого.Как указать фабрику Intellitest, которая должна использоваться для интерфейса?

Мой заказ завод:

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

Я хотел бы использовать эту фабрику для всех ILogic экземпляров PEX пытается создать.

Я попытался добавить следующий атрибут PexAssemblyInfo.cs, и я также пытался добавить его выше моего теста:

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

, но я все еще получаю это предупреждение во время выполнения, когда инструментирование код:

will use Company.Logics.SpecificLogic as ILogic

И поэтому кажется, что он игнорирует мою фабрику каждый раз. Как заставить Intellitest использовать мою фабрику вместо этого?

ответ

2

Если вы хотите использовать PexCreatableByClassFactory вам нужен класс, который реализует интерфейс IPexClassFactory. Вот пример:

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

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

Следует отметить, что IPexClassFactory работает с конкретными классами, а не с интерфейсами. Теперь, если Pex решает, что экземпляр Logic класса должен быть создан, следующий код будет сгенерирован:

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

Если вы предпочитаете использовать PexFactoryMethod также возможно. Тем не менее, PexFactoryMethod работает также с конкретными классами, например:

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

Если вы используете оба решения одновременно т.е. определить метод PEX фабрики и класс PEX фабрики для того же типа, то по моему опыту PEX фабрики метод будет иметь более высокий приоритет.

Если у вас есть несколько классов, которые реализуют интерфейс ILogic, вам необходимо определить заводский метод pex и/или заводский класс pex для каждого из этих классов. В противном случае PEX попытается создать экземпляры этих классов самостоятельно.

Если вы хотите избавиться от упомянутого предупреждения, щелкните его правой кнопкой мыши и выберите Fix из контекстного меню. Pex создаст для вас следующий атрибут:

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

Итак, вы говорите, что невозможно использовать PEX для использования фабрики для интерфейса без указания конкретного типа? –

+0

Я не знаю об этой возможности. Тем не менее, я должен признать, что я довольно свежий с PEX. –