【问题标题】:How do I specify the factory Intellitest should use for an interface?如何指定 Intellitetest 应用于接口的工厂?
【发布时间】:2016-06-06 21:57:55
【问题描述】:

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

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

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

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

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

will use Company.Logics.SpecificLogic as ILogic

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

【问题讨论】:

    标签: c# moq pex intellitest


    【解决方案1】:

    如果你想使用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))]
    

    【讨论】:

    • 所以你是说不指定具体类型就不能告诉 PEX 为接口使用工厂?
    • 我不知道这种可能性。但是,我不得不承认我对 PEX 很陌生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多