代码之家  ›  专栏  ›  技术社区  ›  Rodrigo

如果我在代码中添加了一些东西,我怎么能让我的单元测试失败呢?

  •  0
  • Rodrigo  · 技术社区  · 16 年前

    我该如何测试它们?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Michael Meadows    16 年前

    测试是关于验证所写的内容是否能够做它应该做的事情,仅此而已。所以,如果你写一些代码,你这样做是有原因的。你的测试应该反映出代码确实与你编写代码的原因相匹配。就是这样,没有别的了。I.o.w.:如果你编写了一堆类,你应该测试你编写的行为与行为应该做的事情相比是否正确。

        2
  •  4
  •   Frans Bouma    16 年前

    POCO只是一个老式的东西。它有状态和行为。您可以通过在属性中输入(设置)值并断言该值是您所期望的值来对状态进行单元测试。通过对方法断言期望来单元测试行为。

    这是一个过于简单的POCO及其测试示例。请注意,测试代码比实现代码多。当单元测试正确完成(TDD)时,情况就是这样。

    public class Person
    {
        private Name name = Name.Empty;
        private Address address = Address.Empty;
        private bool canMove;
    
        public Name Name
        {
            set { name = value; }
            get { return name; }
        }
    
        public Address Address
        {
            private set { address = value; }
            get { return address; }
        }
    
        public bool CanMove
        {
            set { canMove = value; }
            get { return value; }
        }
    
        public bool MoveToNewAddress(Address newAddress)
        {
            if (!CanMove) return false;
            address = newAddress;
            return true;
        }
    }
    
    [TestFixture]
    public class PersonTests
    {
        private Person toTest;
        private readonly static Name NAME = new Name { First = "Charlie", Last = "Brown" };
        private readonly static Address ADDRESS =
            new Address {
                Line1 = "1600 Pennsylvania Ave NW",
                City = "Washington",
                State = "DC",
                ZipCode = "20500" };
    
        [SetUp]
        public void SetUp()
        {
            toTest = new Person;
        }
    
        [Test]
        public void NameDefaultsToEmpty()
        {
            Assert.AreEqual(Name.Empty, toTest.Name);
        }
    
        [Test]
        public void CanMoveDefaultsToTrue()
        {
            Assert.AreEqual(true, toTest.CanMove);
        }
    
        [Test]
        public void AddressDefaultsToEmpty()
        {
            Assert.AreEqual(Address.Empty, toTest.Address);
        }
    
        [Test]
        public void NameIsSet()
        {
    
            toTest.Name = NAME;
            Assert.AreEqual(NAME, toTest.Name);
        }
    
        [Test]
        public void CanMoveIsSet()
        {
            toTest.CanMove = false;
            Assert.AreEqual(false, toTest.CanMove);
        }
    
        [Test]
        public void AddressIsChanged()
        {
            Assert.IsTrue(toTest.MoveToNewAddress(ADDRESS));
            Assert.AreEqual(ADDRESS, toTest.Address);
        }
    
        [Test]
        public void AddressIsNotChanged()
        {
            toTest.CanMove = false;
            Assert.IsFalse(toTest.MoveToNewAddress(ADDRESS));
            Assert.AreNotEqual(ADDRESS, toTest.Address);
        }
    }
    

    为了使测试首先失败,请存根方法或属性,但不要实现任何行为。运行测试,观察它们是否失败,然后一次添加一行行为,直到通过。一旦它过去了,停下来。除非你编写了更多的测试,否则不要再编写任何代码(除非你正在重构,在这种情况下,你不需要添加行为)。

        3
  •  1
  •   Beatles1692    16 年前
    1. 我认为你不应该测试 例如,如果你有一辆汽车 生成的属性如下:

      public string Name
      {get;set;}
      

      方法看看它是否正常工作。

    以下是TDD周期:

    • 编写代码并获得绿色信号
    • 重构代码,你应该得到 绿色信号
        4
  •  1
  •   Nat    16 年前

    如果你想向类中添加一个新功能,请编写一个因功能尚未实现而失败的测试,然后实现该功能并查看测试是否通过。

    或者。..

    将代码覆盖率指标作为构建的一部分运行。它们将指示是否在测试未覆盖的情况下添加了代码气体。

    或者。..

    或者以上所有。

        5
  •  1
  •   Andriy Volkov    16 年前

    也许你所说的POCO是指DTO,在这种情况下,答案是: