• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我的成长足迹
夫志当存高远
博客园    首页    新随笔    联系   管理    订阅  订阅

写给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对象等方法,对外部依赖解耦
posted @ 2012-07-04 23:52  bwbwbw1984  阅读(309)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3