如何指定Intellitest应该用于接口的工厂?

时间:2016-02-24 14:38:04

标签: c# moq pex intellitest

使用Intellitest,您可以在生成单元测试时为Intellitest指定一个适合接口的类型,但是我有一个我希望使用的自定义工厂。

我的定制工厂:

ILogic

我想将此工厂用于PEX尝试创建的所有[assembly: PexCreatableByClassFactory(typeof(ILogic), typeof(LogicFactory))] 个实例。

我尝试将以下属性添加到PexAssemblyInfo.cs,我也尝试将其添加到我的测试之上:

will use Company.Logics.SpecificLogic as ILogic

但在检测代码时仍然会收到此运行时警告:

{{1}}

所以似乎每次都忽略了我的工厂。我怎样才能强迫Intellitest使用我的工厂呢?

1 个答案:

答案 0 :(得分: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) { //... } 也适用于具体类,例如:

ILogic

如果您同时使用两种解决方案,即为同一类型定义pex工厂方法和pex工厂类,那么根据我的经验,pex工厂方法将具有更高的优先级。

如果您有多个实现[assembly: PexUseType(typeof(SpecificLogic))] 接口的类,则需要为每个类定义一个pex工厂方法和/或一个pex工厂类。否则,PEX将尝试自己创建这些类的实例。

如果您想要删除上述警告,请右键单击它并从上下文菜单中选择修复。 Pex将为您生成以下属性:

def operation(x):
    return x

items_seen = []
d = {"a":10, "b": 5,"c": 6,"d": 7, "e": 7}

for x in d.values():

    if x not in items_seen:
        print operation(x)
        items_seen.append(x)