学习单元测试业务中的单元测试

Posted 158-186

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习单元测试业务中的单元测试相关的知识,希望对你有一定的参考价值。

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

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

  所以,添加代码

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.。

 

  

以上是关于学习单元测试业务中的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

四则运算单元测试

Go中的单元测试和基准测试

JUnit单元测试

单元测试 NPE,当我添加片段自定义转换时

Go的单元测试技巧

Java单元测试(Junit+Mock+代码覆盖率)