在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方法调用和执行被测试类中私有方法;

感谢您的阅读~

posted @ 2017-11-22 15:54  Yang-Fei  阅读(1055)  评论(0编辑  收藏  举报