• 学习单元测试(二)业务中的单元测试


      上一篇总结是简单的业务,是否正确修改了名称。

      这次就要加上实际业务了。报价要加行为的,对一个物品添加一个报价的能力,这报价必须高于之前对这个物品的所有报价。

      所以,添加代码

    public class Item
        {
    
            public int ItemID { get; private set; }//拍卖物品主键
    
            public string Title { get; set; }//拍卖物品的名称
    
            public string Description { get; set; }//拍卖物品的描述
    
            public DateTime AuctionEndDate { get; set; }//拍卖结束时间
    
            public IList<Bid> Bids { get; set; }//该拍卖物品的报价集合
    
    
            //对一个物品添加一个报价的能力,这报价必须高于之前对这个物品的所有报价
            public void AddBid(Member memberParam, decimal amountParam)
            {
                //1当没有报价存在时,可以添加任何报价
                //2当有报价存在时,可以添加一个比现有报价高的值
                //3当有报价存在时,不能添加一个比现有报价低的值
    
                throw new NotImplementedException();
    
            }
    
        }

      代码中,添加了没有实现的AddBid方法。

      描述了添加报价的实际业务要求,1当没有报价存在时,可以添加任何报价;2当有报价存在时,可以添加一个比现有报价高的值;3当有报价存在时,不能添加一个比现有报价低的值

      先写测试的代码

      1.当没有报价存在时,可以添加任何报价;  

            [TestMethod]
            public void CanAddBidMethod()
            {
                //布置 
    
                Item target = new Item();
    
                Member memberParam = new Member();
    
                decimal amountParam = 150m;
    
                //动作
                target.AddBid(memberParam, amountParam);
    
                //断言
                Assert.AreEqual(1, target.Bids.Count);
                Assert.AreEqual(amountParam, target.Bids[0].BidAmount);
            }    

      断言,Item的报价集合是一个,因为是第一个添加的; 

      2.当没有报价存在时,可以添加一个比现在报价高的值;    

            [TestMethod]
            public void CanAddHigherBidMethod()
            {
                //布置
                Item target = new Item();
    
                Member firstMember = new Member();
                Member secondMember = new Member();
                Decimal amountParam = 150m;
    
                //动作
                target.AddBid(firstMember, amountParam);
                target.AddBid(secondMember, amountParam + 10);
    
                //断言
                Assert.AreEqual(2, target.Bids.Count);
                
            }    

      两个动作,添加了两个报价,其中第二个报价比第一个高。断言是现在的集合中有两个报价。

      3.当有报价存在时,不能添加一个比现在报价低的值;

            [TestMethod]
            [ExpectedException(typeof(InvalidOperationException))]
            public void CannotAddLowerBidMethod()
            {
                //布置
                Item target = new Item();
    
                Member memberParam = new Member();
                Decimal amountParam = 150m;
    
                //动作
                target.AddBid(memberParam, amountParam);
                target.AddBid(memberParam, amountParam - 10);
            }        

      布置好场景后。添加了两个报价,其中第二个是比报价低的。没有断言,是抛出了一个InvalidOperationException类型的异常。

      三个测试已经写好,去实现代码  

       public class Item
        {
            public Item()
            {
                Bids = new List<Bid>();
            }
    
            public int ItemID { get; private set; }//拍卖物品主键
    
            public string Title { get; set; }//拍卖物品的名称
    
            public string Description { get; set; }//拍卖物品的描述
    
            public DateTime AuctionEndDate { get; set; }//拍卖结束时间
    
            public IList<Bid> Bids { get; set; }//该拍卖物品的报价集合
    
    
            //对一个物品添加一个报价的能力,这报价必须高于之前对这个物品的所有报价
            public void AddBid(Member memberParam, decimal amountParam)
            {
                //1当没有报价存在时,可以添加任何报价
                //2当有报价存在时,可以添加一个比现有报价高的值
                //3当有报价存在时,不能添加一个比现有报价低的值 
            
                //在集合为0或者是报价大于集合中的最大报价
                if (Bids.Count() == 0 || amountParam > Bids.Max(e => e.BidAmount))
                {
                    //添加到集合
                    Bids.Add(new Bid() { BidAmount = amountParam, DatePlaced = DateTime.Now, Menber = memberParam });
    
                }
                else 
                {
                    //只能是把集合中已存在的报价,再低的话,抛出InvalidOperation的异常
                    throw new InvalidOperationException("Bid amount too low");
                }
    
            }
        }

     ps:拍卖中的确是要报价高于之前的价格,在单元测试中如何将这实际生活中的场景用计算机语言表达出程序,可以把这一个业务场景分成多个单元测试,比如这篇总结的1,2,3.。

      

  • 相关阅读:
    Ubuntu使用命令行打印文件
    Spring ConditionalOnProperty
    Spring EnableWebMvc vs WebMvcConfigurationSupport
    commons-httpclient中的超时设置
    jdb调试命令
    caching redirect views leads to memory leak (Spring 3.1)
    Clojure web初探
    在现有原生开发Android项目中集成hbuilder开发
    MessageBoard
    CSS布局(五) 圣杯布局
  • 原文地址:https://www.cnblogs.com/158-186/p/10901673.html
Copyright © 2020-2023  润新知