如何从下面的代码中编写TDD代码?

Joe*_*ark 1 c# tdd unit-testing

static void Main(string[] args)
{
    for (int i =1 ; i<=100;i++)
    {
        Console.WriteLine(i.ToString());

        if (i % 3 == 0)
            Console.WriteLine("HOON");
        if (i % 5 == 0)
            Console.WriteLine("Group");
        if (i % 3 == 0 && i % 5 == 0)
            Console.WriteLine("HOON Group");
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要使用上面的代码编写测试代码.

有三个功能.你能告诉我任何人吗?

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 12

您无法从现有代码编写测试驱动代码,因为应编写实现之前编写测试.

最简单的测试代码的方法是提供TextWriter模拟Console.Out和验证生成的输出.

更新:如果您想使用TDD,那么您应该修改您的代码以使其可测试.在这里,您的Program类可以处理许多事情 - 它负责表示(输出结果到控制台)和业务逻辑(计算值).要测试业务逻辑,您应该将此功能移至单独的类.

开始吧.第一次测试:

[Test]
public void ShoulReturnHoonWhenValueDivisibleOnlyBy3()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(3);
    Assert.AreEqual("HOON", result);
}
Run Code Online (Sandbox Code Playgroud)

它无法编译,因为你没有HoonGroup类.创建类,创建方法Calculate.使代码可编辑:

public class HoonGroup
{
    public string Calculate(int value)
    {
        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您的测试失败,因为您返回空字符串.只需硬编码"HOON"即可通过测试.这跟TDD一样好.

public class HoonGroup
{
    public string Calculate(int value)
    {
        return "HOON";
    }
}
Run Code Online (Sandbox Code Playgroud)

下一个测试:

[Test]
public void ShoulReturnGroupWhenValueDivisibleOnlyBy5()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(5);
    Assert.AreEqual("Group", result);
}
Run Code Online (Sandbox Code Playgroud)

当然,测试失败了.更新实施:

public class HoonGroup
{
    public string Calculate(int value)
    {
        return (value == 5) ? "Group" : "HOON";
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来很蠢.但它实现了代码的所有要求.另一个测试:

[Test]
public void ShoulReturnNullWhenValueIsNotDivisibleBy3Or5()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(5);
    Assert.IsNull(result);
}
Run Code Online (Sandbox Code Playgroud)

没问题 - 添加另一个条件:

public class HoonGroup
{
    public string Calculate(int value)
    {
        if (value == 3)
            return "HOON";

        if (value == 5)
            return "Group";

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

测试通过.我们需要更多测试用例.使用NUnit很容易 - 只需用TestCase属性修饰第一个测试(MSTest也有类似功能):

[TestCase(3)]
[TestCase(6)]
[TestCase(99)]
public void ShoulReturnHoonWhenValueDivisibleOnlyBy3(int value)
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(value);
    Assert.AreEqual("HOON", result);
}
Run Code Online (Sandbox Code Playgroud)

现在更容易创建代码,检查值是否可被3整除,然后列出所有可能的值:

public class HoonGroup
{
    public string Calculate(int value)
    {
        if (value % 3 == 0)
            return "HOON";

        if (value == 5)
            return "Group";

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想你得到了TDD的观点和要点.为可被5整除的值创建更多测试用例,并为可被3和5整除的值写入测试.