如何先编写单元测试并稍后编写代码?

Noo*_*per 6 c# nunit unit-testing moq

我是单元测试的新手,并且多次读过我们应该首先编写单元测试然后再写实际代码.截至目前,我正在编写我的方法,然后对代码进行单元测试.

如果你先写测试......

您倾向于编写代码以适合测试.这鼓励了"解决问题的最简单的事情"类型开发,并使您专注于解决不能解决元问题的问题.

如果你先写代码......

您将很想编写测试以适应代码.实际上,这相当于编写问题以适合您的答案,这是一种倒退,并且通常会导致测试价值较低.

听起来不错.但是,即使在我的代码到位之前,我如何编写单元测试?我从字面上接受了这个建议吗?这是否意味着我应该有我的POCO类和接口,然后编写单元测试?

任何人都可以用一个简单的例子说明如何添加两个数字来解释我是如何做到的?

Sim*_*ead 7

这真的很简单.红色,绿色,重构.

红色表示 - 您的代码完全被破坏.语法高亮显示红色,测试未通过.为什么?您尚未编写任何代码.

绿色表示 - 您的应用程序构建和测试通过.您已添加所需的代码.

重构意味着 - 清理它并确保测试通过.

您可以从编写测试开始,如下所示:

[TestMethod]
public void Can_Create_MathClass() {
    var math = new MathClass();
    Assert.IsNotNull(math);
}
Run Code Online (Sandbox Code Playgroud)

这将失败(RED).你是如何解决的?创建类.

public class MathClass {
}
Run Code Online (Sandbox Code Playgroud)

而已.它现在通过(绿色).下一个测试:

[TestMethod]
public void Can_Add_Two_Numbers() {
    var math = new MathClass();
    var result = math.Add(1, 2);
    Assert.AreEqual(3, result);
}
Run Code Online (Sandbox Code Playgroud)

这也失败了(RED).创建Add方法:

public class MathClass {
    public int Add(int a, int b) {
        return a + b;
    }
}
Run Code Online (Sandbox Code Playgroud)

运行测试.这将通过(绿色).

重构是清理代码的问题.这也意味着您可以删除多余的测试.我们知道我们MathClass现在有..所以你可以完全删除Can_Create_MathClass测试.一旦完成......你已经通过了REFACTOR,并且可以继续.

重要的是要记住,重构步骤并不仅仅意味着您的正常代码.它也意味着测试.你不能让你的测试随着时间的推移而恶化.您必须在重构步骤中包含它们.