如果我在代码中添加内容,如何使单元测试失败?

时间:2009-05-26 12:31:02

标签: c# unit-testing poco

我希望我的单元测试覆盖我的POCO。

我该如何测试它们?

如果我添加新房产怎么办?如何使我的测试失败?

测试我知道的属性和方法,但问题是,如何确保我的测试失败,任何东西都被添加到我的poco中。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

从你的问题的阅读中,你要么误解POCO是什么,要么误解单元测试。

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);
    }
}

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

答案 2 :(得分:1)

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

或者...

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

或者...

作为构建的一部分运行突变测试。它们将指示是否有任何覆盖代码的测试只是通过它运行而不是实际测试任何内容。

或以上所有。

答案 3 :(得分:1)

  1. 我相信你不应该测试 框架以及您自己的代码 例如,如果你有一个汽车 生成的属性如下:

    public string Name
    {get;set;}
    

    没有必要进行测试 查看它是否正常工作的方法。

  2. 你不应该测试你的类的内部状态,而应该测试它的行为。
  3. 有时(有些人可能会说,总是)在编写代码之前编写测试更好。这样你就必须了解你想要做什么,而不是理解如何去做。(这种方法称为测试驱动开发)< / LI>

    这是TDD周期:

    • 编写测试并获得红色信号
    • 编写代码并获得绿色信号
    • 重构代码,你应该得到 绿色信号

答案 4 :(得分:1)

也许POCO你的意思是DTO,在这种情况下答案是:

不,你不应该测试你的DTO - 而是测试与它们一起使用的服务。