我该如何指定Intellitest应该使用哪个工厂来处理一个接口?

8
使用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);
    }
}

我希望使用这个工厂来创建PEX尝试创建的所有ILogic实例。
我尝试在PexAssemblyInfo.cs中添加以下属性,也尝试在我的测试上方添加它:
[assembly: PexCreatableByClassFactory(typeof(ILogic), typeof(LogicFactory))]

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

将使用 Company.Logics.SpecificLogic 作为 ILogic

看起来每次都忽略了我的工厂。我该如何强制 Intellitest 使用我的工厂呢?

1个回答

3
如果您想使用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将尝试自己创建这些类的实例。
如果您想要摆脱上述警告,请右键单击它并从上下文菜单中选择“修复”。 PEX将为您生成以下属性:
[assembly: PexUseType(typeof(SpecificLogic))]

所以你的意思是,不能在不指定具体类型的情况下告诉 PEX 使用工厂来处理一个接口? - Nick Udell
我不知道这种可能性。然而,我必须承认我对PEX还很新。 - Michał Komorowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接