單元測試
外部依賴(external dependency)是指系統中的一個物件,它與被測試程式碼互動,但你
卻無法掌握。
(EX:常見外部依賴:執行緒、記憶體、時間),上述提到ExpectedBehavior的其中一種(系統狀態改變)。
虛設常式(stub)是系統中產生一個可控的替代物件,來取代一個外部相依物件
註記:在測試程式中裡面,透過虛設常式來避免直接相依物件造成的問題。只做模擬相依物件行為
接者開始實作,首先我定義Order Interface出來,因為在旅遊系統當中,常常會調用別人家API或是物件
EX:自由行,會呼叫訂房平台與機票平台
範例一,如果今天我訂房平台要跟模擬出agoda 訂單檢驗的物件
    public interface IOrder
    {
        bool IsValid(string orderNo, string guestName);
    }
    public class BookingOrder : IOrder
    {
        public bool IsValid(string orderNo, string guestName)
        {
            return true;
        }
    }
    public class StubOrder : IOrder
    {
        public bool IsValid(string orderNo, string guestName)
        {
            return true;
        }
    }
    public class Order
    {
        private IOrder _iOrder;
        public Order(IOrder iOrder)
        {
            _iOrder = iOrder;
        }
        public bool IsCheckValid(string orderNo, string guestName)
        {
            return _iOrder.IsValid(orderNo, guestName);
        }
    }
開始編寫Test Method
 
    [TestFixture]
    public class OrderTest
    {
        [Test]
        public void IsValidOrder()
        {
            IOrder iorder = new StubOrder();
            Order agodaOrder = new Order(iorder);
            bool result = agodaOrder.IsCheckValid("20180120001", "旅客E先生");
            Assert.IsTrue(result);
        }
    }
範例二:加入分層架構的概念進行假物件
    public interface IProductRepository
    {
        string GetByName(string productId);
    }
    public class ProductRepository : IProductRepository
    {
        public string GetByName(string productId) => "";
    }
    public class StubProductRepository : IProductRepository
    {
        public string GetByName(string productId) => "16 GB隨身碟";
    }
    public class ProductService
    {
        private readonly IProductRepository _productRepository;
        public ProductService(IProductRepository productRepository)
            => _productRepository = productRepository;
        public string GetProductName(string productId)
            => _productRepository.GetByName(productId);
         
    }
        [Test]
        public void GetProductName()
        {
            IProductRepository stubProductRepository = new StubProductRepository();
            ProductService productService = new ProductService(stubProductRepository);
            Assert.AreEqual("16 GB隨身碟", productService.GetProductName("1000"));
        }
這種利用實現假物件的技術,專案裡有太多這種為了測試而寫的類別,將來可能不好維護
元哥的筆記