Intellitest Pex 参数化模拟

Intellitest Pex Parameterize Mock

public enum SystemConstants
 {
     SystemTypeDocument,
     ApplicationTypeDocument
 }

public interface ISystemBaseObject
 {
     SystemConstants SystemType();
 }

 public class ExploreMockExample
 {
     ISystemBaseObject systemBaseObject;
     public ExploreMockExample(ISystemBaseObject systemObject)
     {
         systemBaseObject = systemObject;
     }
     public int MethodToBeTested()
     {
         if (systemBaseObject.SystemType() == SystemConstants.SystemTypeDocument)
         {
             return 1;
         }
         else
         {
             return 2;
         }
     }
 }

结合使用智能测试和 NUnit3。

当我右键单击 MethodToBeTested,然后 select 运行 intellitest 时,预期结果是 Intellitest 测试应达到最大代码覆盖率并创建具有有效测试数据的测试用例以覆盖两者 if (systemBaseObject.SystemType() == SystemConstants.SystemTypeDocument) 和 else 分支语句。

一些博客建议为class创建工厂并创建接口的模拟对象。并使用PexChoose静态方法让pex框架探索代码以达到最大的代码覆盖率。

[PexFactoryMethod(typeof(ExploreMockExample))]
     public static ExploreMockExample CreateMock()
     {
         var mockComosBaseObject = new Mock<ISystemBaseObject>();
         mockComosBaseObject.Setup(c =>c.SystemType()).
             Returns(PexChoose.EnumValue<SystemConstants>(nameof(SystemConstants)));
         return new ExploreMockExample(mockComosBaseObject.Object);            
     }

通过以上设置,Intellitest 可以生成一个覆盖 if 语句的测试用例,if (systemBaseObject.SystemType() == SystemConstants.SystemTypeDocument).

可以做什么,以允许 intellitest 创建测试用例,该用例将覆盖结果值为 2 的 else 语句。

为您的界面创建模拟实现。如下所述,

     public class SystemBaseObject : ISystemBaseObject
     {
         public SystemConstants SystemType()
         {
             return PexChoose.EnumValue<SystemConstants>("SystemConstants");
         }
     }

PexChoose 将帮助智能测试探索代码,return 值将取决于原始 class 中 SystemConstants 的使用。 然后,使用 SystemBaseObject 创建 ExploreMockExample 工厂,

     [PexFactoryMethod(typeof(ExploreMockExample))]
     public static ExploreMockExample Create()
     {
         return new ExploreMockExample(new SystemBaseObject());            
     }

运行 Intellitest 在实际方法 MethodToBeTested 上,Intellitest 将创建 2 个单元测试用例来覆盖 if else 分支语句。

第一个测试用例,

     [PexGeneratedBy(typeof(ExploreMockExampleTest))]
     public void MethodToBeTested806()
     {
         ExploreMockExample exploreMockExample;
         int i;
         exploreMockExample = ExploreMockExampleFactory.Create();
         i = this.MethodToBeTested(exploreMockExample);
         PexAssert.AreEqual<int>(1, i);
         PexAssert.IsNotNull((object)exploreMockExample);
     }

请注意PexAssert.AreEqual(1, i),如果分支会覆盖

第二个测试用例,

     [PexGeneratedBy(typeof(ExploreMockExampleTest))]
     public void MethodToBeTested792()
     {
         ExploreMockExample exploreMockExample;
         int i;
         exploreMockExample = ExploreMockExampleFactory.Create();
         IPexChoiceRecorder choices = PexChoose.Replay.Setup();
         choices.NextSegment(1).DefaultSession
             .At(0, "SystemConstants", (object)(SystemConstants.ApplicationTypeDocument));
         i = this.MethodToBeTested(exploreMockExample);
         PexAssert.AreEqual<int>(2, i);
         PexAssert.IsNotNull((object)exploreMockExample);
     }

请注意 PexAssert.AreEqual(2, i),这将涵盖 else 分支。

使用 PexChoose.Replay.Setup() 它将 return IPexChoiceRecorder,并且它将选择将 SystemConstants.ApplicationTypeDocument 作为参数值来覆盖 else 块。