zoukankan      html  css  js  c++  java
  • 写给PPT用,可测试性驱动开发导向IOC的过程

    可测试性驱动开发的一个不严谨例子

    一个购物车的例子

    public class Cart
        {
            public Logger logger = new Logger();

            public List<Product> ProductList;

            public Cart()
            {
                ProductList = new List<Product>();
            }
     
            public int GetTotalCount()
            {
                return this.ProductList.Count;
            }

            public void Add(Product product)
            {
                //小记下log
                logger.Log(string.Format("添加了一件商品"));
                //一大段逻辑
                Console.WriteLine("判断是否重复");
                Console.WriteLine("判断商品ID是不是正确"); 

                ProductList.Add(product);
            }
        }

    logger一开始是这样的

    public class Logger
        {
            //插入数据库
            public void Log(string message)
            {
                Console.WriteLine(string.Format("插入数据库:{0}",message));
            }
        }

     测试代码,但是。。。为了测试还要写数据库吗?我只是想测试下购物车的逻辑呃。。。

    [TestMethod()]
            public void AddTest()
            {
                Cart cart = new Cart(); 
    // TODO: Initialize to an appropriate value
                Product product = new Product();
                cart.Add(product);
                Assert.AreEqual<int>(1,cart.GetTotalCount());
            }

     开始可测试性重构

    public interface ILog
        {
            void Log(string message);
        }

        public class Logger:ILog
        {
            //插入数据库
            public void Log(string message)
            {
                Console.WriteLine(string.Format("插入数据库:{0}",message));
            }
        }

     测试代码修改

     public ILog logger;


            public Cart(ILog logger)
            {
                ProductList = new List<Product>();
                this.logger = logger;
            }
     public class MemLog : ILog
        {
            public void Log(string message)
            {
                Console.WriteLine("记内存下就好");
            }
        }

    [TestMethod()]
            public void AddTest()
            {
                Cart cart = new Cart(new MemLog());             Product product = new Product();
                cart.Add(product);
                Assert.AreEqual<int>(1,cart.GetTotalCount());
            }
    这下不用访问数据库,都在内存中进行,为了可测试性的目的,我们通过重构,通过构造函数注入,mock对象等方法,对外部依赖解耦
  • 相关阅读:
    Android 生命周期
    struts标签,<s:textfield>嵌套<s:property>的问题
    设置input 内容居中显示 .
    Jquery实现遮罩层,就是弹出DIV周围都灰色不能操作
    如何用Jquery实现 ,比如点击图片之后 ,该图片变成向下的箭头,再点击向下箭头的图片 又变成原始图片呢
    html制作,点击文字超链接显示文本框,再点击文字超链接隐藏文本框
    hibernate mysql视图操作
    Java 日期时间 Date类型,long类型,String类型表现形式的转换
    Spring启动异常: cvc-elt.1: Cannot find the declaration of element 'beans'(转)
    解决不联网无法启动struts2问题
  • 原文地址:https://www.cnblogs.com/brightwang/p/2577017.html
Copyright © 2011-2022 走看看