Unit Test

Moq 一個用來模擬物件的類別庫

前言 當系統利用介面完成物件來隔離外部物件之後,為了方便測試通常會寫一些假的物件來抽換 但功能越來越多之後,測試的假類別也越多,檔案不好管理 這時後可以讓Moq利用反射的方式讓我們很容易地新增假物件 Moq只能模擬公開的介面,如果是繼承的類別則需要Virtual才能模擬 要使用Moq很簡單,利用NuGet安裝套件就行了 ](http://1.bp.blogspot.com/-cwTzcXKv6l0/U408MjPlOYI/AAAAAAAABXU/yxksMr1XfO8/s1600/01.Moq.png) 用一個簡單的IFoo介面來當例子 public interface IFoo { void F1(); int F2(); int F3(int x); event EventHandler<object> MyEvent; } 首先建立一個IFoo型別的Mock物件 在建構式中可以指定MockBehavior來設定模擬物件的程度 Strict是限制需要完整模擬物件,Loose則不需要 預設為Default,也就是Loose private Mock<IFoo> mock; [TestInitialize] public void MyTestInitialize() { this.mock = new Mock<IFoo>(); } 一開始先用沒有回傳值的函式當例子,就先不做更多的設定 直接使用Mock物件的Object屬性取得模擬的假物件就可以使用了 這裡用Verify和Times來檢查該函式的呼叫次數 [TestMethod] public void TestMethod1() { Mock<IFoo> foo = new Mock<IFoo>(); foo.Object.F1(); foo.Verify(x => x.F1(), Times.Once()); } 再來用一個有回傳值的函式當例子,所以再加上回傳值的設定 這裡的意思是呼叫F2函式的時後,總是回傳123的值回來 [TestMethod] public void TestMethod2() { Mock<IFoo> foo = new Mock<IFoo>(); foo.


Unit Test 程式結構

先新增一個測試專案 ](http://1.bp.blogspot.com/-TqMLm4sU89c/U1jM698OU3I/AAAAAAAABU4/SZc98f6b7kY/s1600/01.%E6%96%B0%E5%A2%9E%E5%B0%88%E6%A1%88.png) 可以看到主要元件是Microsoft.VisualStudio.QualityTools.UnitTestFramework ](http://4.bp.blogspot.com/-ePU5ykFwprU/U1jM-8lYv-I/AAAAAAAABVA/FjaE9kfddxY/s1600/02.%E6%96%B9%E6%A1%88%E7%B8%BD%E7%AE%A1.png) 該元件中常用的Attribute如下 屬性 說明 TestClass 用來識別內含測試方法的類別 TestMethod 用來識別測試方法,測試方法必須放置在測試類別中 AssemblyInitialize 用於該組件所有的測試之前,用來配置此組件所佔用的資源 ClassInitialize 用於測試類別的所有測試之前,用來配置該測試類別所使用的資源 TestInitialize 用於測試方法執行之前,用來配置該測試方法中所使用的資源 TestCleanup 用於測試方法執行完成之後,用來釋放該測試方法所佔用的資源 ClassCleanup 用於測試類別中所有的測試完成之後,用來釋放該測試類別所佔用的資源 AssemblyCleanup 用於該組件所有測試類別完成測試之後,用來釋放此組件所佔用的資源 using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace UnitTestProject1 { [TestClass] public class UnitTest1 { [TestClass()] public sealed class DivideClassTest { [AssemblyInitialize()] public static void MyAssemblyInitialize(TestContext context) { Console.


Unit Test Assert 類別

Assert 類別 屬性 說明 AreEqual 確認兩個指定的物件相等如果這些物件都不相等,判斷提示就會失敗 AreNotEqual 確認兩個指定的物件不相等如果這些物件都相等,判斷提示就會失敗 AreSame 確認兩個指定的物件變數參考相同的物件如果它們參考不同的物件,判斷提示就會失敗 AreNotSame 確認兩個指定的物件變數參考不同的物件如果它們參考相同的物件,判斷提示就會失敗 IsTrue 驗證指定的條件是 true如果條件為 false,判斷提示就會失敗。 IsFalse 驗證指定的條件是 false如果條件為 true,判斷提示就會失敗 IsNull 確認指定的物件是 null如果它不是 null,判斷提示就會失敗 IsNotNull 確認指定的物件不是 null如果它是 null,判斷提示就會失敗 IsInstanceOfType 確認指定的物件是指定之型別的執行個體如果此型別不在物件的繼承階層架構內,判斷提示就會失敗 IsNotInstanceOfType 確認指定的物件不是指定之型別的執行個體如果此型別位於物件的繼承階層架構內,判斷提示就會失敗 Fail 判斷提示失敗,但不檢查任何條件 Inconclusive 表示無法驗證判斷提示 CollectionAssert 類別 屬性 說明 AllItemsAreInstancesOfType 確認指定之集合中的所有項目都是指定之型別的執行個體如果任何項目的型別不在其繼承階層架構內,判斷提示就會失敗 AllItemsAreNotNull 確認指定之集合中的所有項目都不是 null如果有任何項目是 null,判斷提示就會失敗 AllItemsAreUnique 確認指定之集合中的所有項目都是唯一的如果集合中有任兩個項目相等,判斷提示就會失敗 AreEqual 確認兩個指定的集合相等如果這些集合都不相等,判斷提示就會失敗 AreNotEqual 確認兩個指定的集合不相等如果這些集合都相等,判斷提示就會失敗 AreEquivalent 確認兩個指定的集合對等如果這些集合都不對等,判斷提示就會失敗 AreNotEquivalent 確認兩個指定的集合不對等如果這些集合都對等,判斷提示就會失敗 Contains 確認指定的集合包含指定的項目如果此項目不在集合中,判斷提示就會失敗 DoesNotContain 確認指定的集合不包含指定的項目如果此項目位於集合中,判斷提示就會失敗 IsSubsetOf 確認第一個集合是第二個集合的子集 IsNotSubsetOf 確認第一個集合不是第二個集合的子集 StringAssert 類別 屬性 說明 Contains 確認第一個字串包含第二個字串這個方法會區分大小寫 StartsWith 確認第一個字串以第二個字串開始這個方法會區分大小寫 EndsWith 確認第一個字串以第二個字串結束這個方法會區分大小寫 Matches 確認指定的字串符合規則運算式 DoesNotMatch 確認指定的字串不符合規則運算式