Nic*_*ell 7 c# pex moq intellitest
使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想将这个工厂用于ILogicPEX尝试创建的所有实例.
我尝试将以下属性添加到PexAssemblyInfo.cs,我也尝试将其添加到我的测试之上:
[assembly: PexCreatableByClassFactory(typeof(ILogic), typeof(LogicFactory))]
Run Code Online (Sandbox Code Playgroud)
但在检测代码时我仍然会收到此运行时警告:
will use Company.Logics.SpecificLogic as ILogic
所以似乎每次都忽略了我的工厂.我怎样才能强迫Intellitest使用我的工厂呢?
如果您想使用PexCreatableByClassFactory,您需要一个实现IPexClassFactory接口的类。这是一个例子:
public partial class LogicFactory : IPexClassFactory<Logic>
{
public Logic Create()
{
//...
}
}
[assembly: PexCreatableByClassFactory(typeof(Logic), typeof(LogicFactory))]
Run Code Online (Sandbox Code Playgroud)
应该注意的是,它IPexClassFactory适用于具体类,而不适用于接口。现在,如果 Pex 决定Logic应该创建类的实例,则会生成以下代码:
LogicFactory2 s2 = new LogicFactory();
Logic s1 = ((IPexClassFactory<Logic>)s2).Create();
Run Code Online (Sandbox Code Playgroud)
如果您愿意使用PexFactoryMethod它也是可以的。但是,PexFactoryMethod也适用于具体类,例如:
[PexFactoryMethod(typeof(Logic))]
public static Logic Create(string defaultUICulture, bool saveSuccessful)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
如果您同时使用这两种解决方案,即为同一类型定义一个 pex 工厂方法和一个 pex 工厂类,那么根据我的经验,pex 工厂方法将具有更高的优先级。
如果您有多个实现ILogic接口的类,则需要为每个类定义一个 pex 工厂方法和/或一个 pex 工厂类。否则,PEX 将尝试自己创建这些类的实例。
如果您想摆脱提到的警告,请右键单击它,然后从上下文菜单中选择“修复” 。Pex 将为您生成以下属性:
[assembly: PexUseType(typeof(SpecificLogic))]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1016 次 |
| 最近记录: |