• 使用 Moq 测试.NET Core 应用


     

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html

    第二篇文章, 关于方法Mock的介绍: https://www.cnblogs.com/cgzl/p/9300356.html

    第三篇文章, 关于属性Mock的介绍: https://www.cnblogs.com/cgzl/p/9304567.html

    第四篇文章, 关于行为Mock的介绍: https://www.cnblogs.com/cgzl/p/9306728.html

    本文介绍使用Moq其它一些功能.

    使用的代码: https://github.com/solenovex/Moq4-Tutorial-Code 里面的 05 Before 部分.

    https://segmentfault.com/a/1190000017569492   .NET Core单元测试之搞死开发的覆盖率统计

    __________________________________________________________________________________

    2 3 使用 Moq 测试.NET Core 应用 -- Mock 属性

    [Fact]
    public void ApproveYoungCheapPlayerTransfer()
    {
    //递归Mock
    Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>();
    //使用嵌套 子
    Mock<IMedicalRoomStatus> medicalRoomStatus = new Mock<IMedicalRoomStatus>();
    medicalRoomStatus.Setup(x => x.IsAvailable).Returns("PASS"); //.Returns(true);
    //使用嵌套 父
    Mock<IMedicalRoom> medicalRoom = new Mock<IMedicalRoom>();
    medicalRoom.Setup(x => x.Status).Returns(medicalRoomStatus.Object);
    //使用嵌套 父父
    mockExamination.Setup(x => x.MedicalRoom).Returns(medicalRoom.Object);
    //mockExamination.Setup(x =>
    // x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
    mockExamination.Setup(x => x.IsMedicalRoomAvailable).Returns(true);
    mockExamination.Setup(x =>
    x.IsHealthy(
    It.Is<int>(age => age < 30),
    It.IsIn<int>(80, 85, 90),
    It.IsInRange<int>(75, 99, Range.Inclusive)))
    .Returns(true);

    var approval = new TransferApproval(mockExamination.Object);

    var emreTransfer = new TransferApplication
    {
    PlayerName = "Emre Can",
    PlayerAge = 24,
    TransferFee = 0,
    AnnualSalary = 4.52m,
    ContractYears = 4,
    IsSuperStar = false,
    PlayerStrength = 80,
    PlayerSpeed = 75,
    };

    var result = approval.Evaluate(emreTransfer);

    Assert.Equal(TransferResult.Approved, result);
    }


    [Fact]
    public void ApproveYoungCheapPlayerTransfer01()
    {
    //递归Mock可以为Mock对象设定默认值
    Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>() {
    DefaultValue= DefaultValue.Mock
    };
    //使用嵌套
    mockExamination.Setup(x => x.MedicalRoom.Status.IsAvailable).Returns("PASS");//.Returns(true);
    //mockExamination.Setup(x =>
    // x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
    mockExamination.Setup(x => x.IsMedicalRoomAvailable).Returns(true);
    mockExamination.Setup(x =>
    x.IsHealthy(
    It.Is<int>(age => age < 30),
    It.IsIn<int>(80, 85, 90),
    It.IsInRange<int>(75, 99, Range.Inclusive)))
    .Returns(true);

    var approval = new TransferApproval(mockExamination.Object);

    var emreTransfer = new TransferApplication
    {
    PlayerName = "Emre Can",
    PlayerAge = 24,
    TransferFee = 0,
    AnnualSalary = 4.52m,
    ContractYears = 4,
    IsSuperStar = false,
    PlayerStrength = 80,
    PlayerSpeed = 75,
    };

    var result = approval.Evaluate(emreTransfer);

    Assert.Equal(TransferResult.Approved, result);
    }


    [Fact]
    public void PhysicalGradeShouldPassWhenTransferringSuperStar()
    {
    var mockExamination = new Mock<IPhysicalExamination>
    {
    DefaultValue = DefaultValue.Mock
    };

    mockExamination.SetupAllProperties();

    // 开始追踪PhysicalGrade属性
    mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Failed);

    mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);

    var approval = new TransferApproval(mockExamination.Object);

    var cr7Transfer = new TransferApplication
    {
    PlayerName = "Cristiano Ronaldo",
    PlayerAge = 33,
    TransferFee = 112m,
    AnnualSalary = 30m,
    ContractYears = 4,
    IsSuperStar = true,
    PlayerStrength = 90,
    PlayerSpeed = 90
    };

    var result = approval.Evaluate(cr7Transfer);

    Assert.Equal(PhysicalGrade.Passed, mockExamination.Object.PhysicalGrade);
    }

    [Fact]
    public void ReferredToBossWhenTransferringSuperStar()
    {
    var mockExamination = new Mock<IPhysicalExamination>(MockBehavior.Strict);

    mockExamination.SetupAllProperties();

    mockExamination.Setup(x => x.MediacalRoom.Status.IsAvailable).Returns("Available");
    //mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Passed);

    //追踪属性配置默认值 追踪所有属性 mockExamination.SetupAllProperties() 必须放在第一行;
    //mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Failed);

    mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
    var approval = new TransferApproval(mockExamination.Object);

    var cr7Transfer = new TransferApplication
    {
    PlayerName = "Cristiano Ronaldo",
    PlayerAge = 33,
    TransferFee = 112m,
    AnnualSalary = 30m,
    ContractYears = 4,
    IsSuperStar = true,
    PlayerStrength = 90,
    PlayerSpeed = 90
    };

    var result = approval.Evaluate(cr7Transfer);

    // Assert.Equal(TransferResult.ReferredToBoss, result);
    Assert.Equal(PhysicalGrade.Passed, mockExamination.Object.PhysicalGrade);
    }

    4 使用Moq 测试.NET Core 应用 -- Mock 行为
    [Fact]
    public void ShouldPhysicalExamineWhenTransferringSuperStar()
    {
    var mockExamination = new Mock<IPhysicalExamination>();

    mockExamination.Setup(x => x.MediacalRoom.Status.IsAvailable).Returns("Available");
    mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Passed);
    mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);

    var approval = new TransferApproval(mockExamination.Object);

    var cr7Transfer = new TransferApplication
    {
    PlayerName = "Cristiano Ronaldo",
    PlayerAge = 33,
    TransferFee = 112m,
    AnnualSalary = 30m,
    ContractYears = 4,
    IsSuperStar = true,
    PlayerStrength = 90,
    PlayerSpeed = 90
    };

    var result = approval.Evaluate(cr7Transfer);
    result = approval.Evaluate(cr7Transfer);
    // Assert.Equal(TransferResult.ReferredToBoss, result);
    // mockExamination.Verify(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())); //判断指定的事件是否执行
    // mockExamination.Verify(x => x.IsHealthy(33, 95, 88), "Arguments not match !!!!"); //判断指定的事件是否执行
    //mockExamination.Verify(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()), Times.Exactly(2)); //判断指定的事件执行次数
    //mockExamination.VerifyGet(x => x.MediacalRoom.Status.IsAvailable);
    mockExamination.VerifySet(x => x.PhysicalGrade = PhysicalGrade.Passed);//判断PhysicalGrade属性已经被赋值了 PhysicalGrade.Passed
    }

    5. 使用 Moq 测试.NET Core 应用 -- 其它
    [Fact]
    public void PostponedWhenTransferringChildPlayer()
    {
    //mockExamination.Setup(x => x.IsHealthy(It.Is<int>(age => age < 16), It.IsAny<int>(), It.IsAny<int>()))
    // .Throws<Exception>();
    mockExamination.Setup(x => x.IsHealthy(It.Is<int>(age => age < 16), It.IsAny<int>(), It.IsAny<int>()))
    .Throws(new Exception("The player is still a child"));

    var childTransfer = new TransferApplication
    {
    PlayerName = "Some Child Player",
    PlayerAge = 13,
    TransferFee = 0,
    AnnualSalary = 0.01m,
    ContractYears = 3,
    IsSuperStar = false,
    PlayerStrength = 40,
    PlayerSpeed = 50
    };

    var result = approval.Evaluate(childTransfer);

    Assert.Equal(TransferResult.Postponed, result);
    }


    [Fact]
    public void ShouldPlayerHealthCheckedWhenTransferringSuperStar()
    {
    //事件是否调用
    mockExamination.DefaultValue = DefaultValue.Mock;
    mockExamination.Setup(x => x.MediacalRoom.Status.IsAvailable).Returns("Avaliable");
    mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Passed);
    mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()))
    .Returns(true)
    .Raises(x => x.HealthChecked += null, EventArgs.Empty);


    //mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()))
    // .Returns(true)
    // .Raises(x => x.HealthChecked += null, EventArgs.Empty);

    var cr7Transfer = new TransferApplication
    {
    PlayerName = "Cristiano Ronaldo",
    PlayerAge = 33,
    TransferFee = 112m,
    AnnualSalary = 30m,
    ContractYears = 4,
    IsSuperStar = true,
    PlayerStrength = 90,
    PlayerSpeed = 90
    };

    var result = approval.Evaluate(cr7Transfer);

    //mockExamination.Raise(x => x.HealthChecked+=null, EventArgs.Empty);

    Assert.True(approval.PlayerHealthChecked);
    }


    [Fact]
    public void ShouldPostponedWhenNotInTransferPeriod()
    {
    //使用没有实现接口的方法, 注意这个方法必须是 virtual
    mockTransferPolicy.Setup(x => x.IsInTransferPeriod()).Returns(false);
    mockTransferPolicy.Protected().Setup<bool>("IsBannedFromTransferring") //Protected() 注意 protected
    //.Setup<bool>("IsBannedFromTransferring",ItExpr.IsAny<String>()) //有参数的话, 需要用到ItExpr类.
    .Returns(true);

    //mockTransferPolicy.Protected()
    // .Setup<bool>("IsBannedFromTransferring")
    // // .Setup<bool>("IsBannedFromTransferring", ItExpr.IsAny<string>())
    // .Returns(true);

    var cr7Transfer = new TransferApplication
    {
    PlayerName = "Cristiano Ronaldo",
    PlayerAge = 33,
    TransferFee = 112m,
    AnnualSalary = 30m,
    ContractYears = 4,
    IsSuperStar = true,
    PlayerStrength = 90,
    PlayerSpeed = 90
    };

    var result = approval.Evaluate(cr7Transfer);
    Assert.Equal(TransferResult.Postponed, result);
    }

    [Fact]
    public void LinqToMocks()
    {
    //Linq to Mocks 一次性为测试Mock对象配置返回值
    var mockExamination = Mock.Of<IPhysicalExamination>
    (
    me => me.MediacalRoom.Status.IsAvailable == "Available" &&
    me.PhysicalGrade == PhysicalGrade.Passed &&
    me.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()) == true
    );

    var mockTransferPolicy = Mock.Of<TransferPolicyEvaluator>
    (
    mt => mt.IsInTransferPeriod() == false
    );

    approval = new TransferApproval(mockExamination, mockTransferPolicy);

    var cr7Transfer = new TransferApplication
    {
    PlayerName = "Cristiano Ronaldo",
    PlayerAge = 33,
    TransferFee = 112m,
    AnnualSalary = 30m,
    ContractYears = 4,
    IsSuperStar = true,
    PlayerStrength = 90,
    PlayerSpeed = 90
    };

    var result = approval.Evaluate(cr7Transfer);
    Assert.Equal(TransferResult.Postponed, result);
    }

  • 相关阅读:
    调用微信上传图片的接口
    jqgrid取消列排序
    jqGrid动态添加列
    jqgrid多次调用合并表头出现重叠的处理
    echarts3.0版本断点连线的处理
    JAVA数据转换常用方法
    Java面试常见各种概念区别比较
    Python从零开始(1)新手常问
    记录一下11月份的面试
    Centos7 下安装 mysql8
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/10516491.html
Copyright © 2020-2023  润新知