在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方法進行單獨的測試。blog

如何對private方法作單元測試

有兩種方式能夠對private方法作單元測試,get

  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);
    }
}

上述代碼中,執行了以下任務:it

  1. 建立PrivateObject對象,將Salary類型作爲參數傳遞給PrivateObject的構造函數;
  2. 使用Invoke方法調用和執行被測試類中私有方法;

感謝您的閱讀~io

相關文章
相關標籤/搜索