如何指定 Intellitest 应该用于接口的工厂?
How do I specify the factory Intellitest should use for an interface?
使用 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);
}
}
我想将此工厂用于 PEX 尝试创建的所有 ILogic
个实例。
我尝试将以下属性添加到 PexAssemblyInfo.cs,我还尝试将其添加到我的测试之上:
[assembly: PexCreatableByClassFactory(typeof(ILogic), typeof(LogicFactory))]
但我在检测代码时仍然收到此运行时警告:
will use Company.Logics.SpecificLogic as ILogic
所以它似乎每次都无视我的工厂。我如何强制 Intellitest 使用我的工厂?
如果你想使用 PexCreatableByClassFactory 你需要一个 class 实现 IPexClassFactory 接口。这是一个例子:
public partial class LogicFactory : IPexClassFactory<Logic>
{
public Logic Create()
{
//...
}
}
[assembly: PexCreatableByClassFactory(typeof(Logic), typeof(LogicFactory))]
应该注意 IPexClassFactory
适用于具体的 classes 而不是接口。现在,如果 Pex 决定创建 Logic
class 的实例,将生成以下代码:
LogicFactory2 s2 = new LogicFactory();
Logic s1 = ((IPexClassFactory<Logic>)s2).Create();
如果你喜欢使用PexFactoryMethod
也是可以的。但是,PexFactoryMethod
也适用于具体的 classes 例如:
[PexFactoryMethod(typeof(Logic))]
public static Logic Create(string defaultUICulture, bool saveSuccessful)
{
//...
}
如果您同时使用这两种解决方案,即为同一类型定义一个 pex 工厂方法和一个 pex 工厂 class,那么根据我的经验,pex 工厂方法将具有更高的优先级。
如果您有多个 class 实现了 ILogic
接口,您需要为每个 and/or 定义一个 pex 工厂方法 class 一个 pex 工厂 class =38=]es。否则 PEX 将尝试自己创建这些 classes 的实例。
如果您想摆脱提到的警告,请右键单击它,然后从上下文菜单中 select 修复。 Pex 将为您生成以下属性:
[assembly: PexUseType(typeof(SpecificLogic))]
使用 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);
}
}
我想将此工厂用于 PEX 尝试创建的所有 ILogic
个实例。
我尝试将以下属性添加到 PexAssemblyInfo.cs,我还尝试将其添加到我的测试之上:
[assembly: PexCreatableByClassFactory(typeof(ILogic), typeof(LogicFactory))]
但我在检测代码时仍然收到此运行时警告:
will use Company.Logics.SpecificLogic as ILogic
所以它似乎每次都无视我的工厂。我如何强制 Intellitest 使用我的工厂?
如果你想使用 PexCreatableByClassFactory 你需要一个 class 实现 IPexClassFactory 接口。这是一个例子:
public partial class LogicFactory : IPexClassFactory<Logic>
{
public Logic Create()
{
//...
}
}
[assembly: PexCreatableByClassFactory(typeof(Logic), typeof(LogicFactory))]
应该注意 IPexClassFactory
适用于具体的 classes 而不是接口。现在,如果 Pex 决定创建 Logic
class 的实例,将生成以下代码:
LogicFactory2 s2 = new LogicFactory();
Logic s1 = ((IPexClassFactory<Logic>)s2).Create();
如果你喜欢使用PexFactoryMethod
也是可以的。但是,PexFactoryMethod
也适用于具体的 classes 例如:
[PexFactoryMethod(typeof(Logic))]
public static Logic Create(string defaultUICulture, bool saveSuccessful)
{
//...
}
如果您同时使用这两种解决方案,即为同一类型定义一个 pex 工厂方法和一个 pex 工厂 class,那么根据我的经验,pex 工厂方法将具有更高的优先级。
如果您有多个 class 实现了 ILogic
接口,您需要为每个 and/or 定义一个 pex 工厂方法 class 一个 pex 工厂 class =38=]es。否则 PEX 将尝试自己创建这些 classes 的实例。
如果您想摆脱提到的警告,请右键单击它,然后从上下文菜单中 select 修复。 Pex 将为您生成以下属性:
[assembly: PexUseType(typeof(SpecificLogic))]