8

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

我的定制工厂:

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

我想将此工厂用于ILogicPEX 尝试创建的所有实例。

我尝试将以下属性添加到 PexAssemblyInfo.cs,并且还尝试将其添加到我的测试上方:

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

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

will use Company.Logics.SpecificLogic as ILogic

所以它似乎每次都无视我的工厂。如何强制 Intellitetest 使用我的工厂?

4

1 回答 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))]
于 2016-03-04T10:08:00.687 回答