zoukankan      html  css  js  c++  java
  • 在MS Test中如何测试private方法

    前言:

    在博客开始之前,我们先讨论一下是否应该对private方法做测试,通常有两种观点:

    1. private方法应该被测试;
    2. private方法不应该被测试;

    我们以下面的代码为例子来进行说明:

    public class Salary
    {
        public int Calcuate(int bs, int nwd)
        {
            int ts;
    
            if(IsValidNwd(nwd))
            {
                ts = bs * nwd;
            }
            else
            {
                ts = 1000;
            }
    
            return ts;
        }
    
        private bool IsValidNwd(int nwd)
        {
            if(nwd > 8)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    

    这个被测试类中包含两个方法:

    1. IsValidNwd是一个private方法,当nwd大于8时返回true,否则返回false;
    2. Calcuate方法是一个public方法,包含两个输入参数。Calculate方法中第一步使用IsValidNwd方法检查nwd是否合法,如果nwd合法,则使用基本工资*工作天数。如果nwd不合法,则返回一个固定值1000.

    观点1: private方法不应该被单独测试,这是因为public方法中会使用到这些私有方法当我们测试public方法时,private方法的行为会被一并测试掉。

    观点2: 要对private方法进行单独的测试。

    如何对private方法做单元测试

    有两种方式可以对private方法做单元测试,

    1. 使用Refection --- 比较复杂;
    2. 使用VSTS PrivateObject类;

    下面的示例中使用PrivateObject类来完成,

    1. 可以直接创建一个MS Unit Test工程,或者新建一个类库工程,添加Microsoft.VisualStudio.QualityTools.UnitTestFramework引用,
    2. 添加Microsoft.VisualStudio.TestTools.UnitTesting名称空间
    [TestClass]
    public class SalaryFunctionalTesting
    {
        [TestMethod]
        public void IsValidNwd_ValidInput_ReturnTrue()
        {
            PrivateObject obj = new PrivateObject(typeof(Salary));
    
            bool result = Convert.ToBoolean(obj.Invoke("IsValidNwd",9));
    
            Assert.AreEqual(true, result);
        }
    
        [TestMethod]
        public void IsValidNwd_InValidInput_ReturnFalse()
        {
            PrivateObject obj = new PrivateObject(typeof(Salary));
    
            bool result = Convert.ToBoolean(obj.Invoke("IsValidNwd", 6));
    
            Assert.AreEqual(false, result);
        }
    }
    

    上述代码中,执行了如下任务:

    1. 创建PrivateObject对象,将Salary类型做为参数传递给PrivateObject的构造函数;
    2. 使用Invoke方法调用和执行被测试类中私有方法;

    感谢您的阅读~

  • 相关阅读:
    AT4144[ARC098D]Donation【Kruskal重构树,dp】
    YbtOJ#643机器决斗【贪心,李超树】
    P3273[SCOI2011]棘手的操作【线段树,并查集】
    AT3950[AGC022E]Median Replace【贪心,dp】
    P3760[TJOI2017]异或和【树状数组】
    AT4505[AGC029F]Construction of a tree【构造题,hall定理,网络流】
    Ybt#452序列合并【期望dp】
    AT3949[AGC022D]Shopping【贪心】
    AT4995[AGC034E] Complete Compress【树形dp】
    P4338[ZJOI2018]历史【LCT】
  • 原文地址:https://www.cnblogs.com/yang-fei/p/7879586.html
Copyright © 2011-2022 走看看