Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从下面的代码中编写TDD代码?_C#_Unit Testing_Tdd - Fatal编程技术网

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

C# 如何从下面的代码中编写TDD代码?,c#,unit-testing,tdd,C#,Unit Testing,Tdd,不能从现有代码编写测试驱动的代码,因为应该在编写实现之前编写测试 测试代码的最简单方法是向控制台提供TextWritermock.Out并验证生成的输出 更新:如果你想使用TDD,那么你应该修改你的代码使其可测试。在这里,您的程序类做了很多事情——它负责表示(将结果输出到控制台)和业务逻辑(计算值)。为了测试业务逻辑,您应该将此功能移动到单独的类中 让我们开始吧。第一次测试: [TestClass] public class UnitTest1 { [TestMethod] pu

不能从现有代码编写测试驱动的代码,因为应该在编写实现之前编写测试

测试代码的最简单方法是向控制台提供
TextWriter
mock.Out并验证生成的输出

更新:如果你想使用TDD,那么你应该修改你的代码使其可测试。在这里,您的
程序
类做了很多事情——它负责表示(将结果输出到控制台)和业务逻辑(计算值)。为了测试业务逻辑,您应该将此功能移动到单独的类中

让我们开始吧。第一次测试:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
    }
}
它无法编译,因为您没有
HoonGroup
类。创建类,创建方法
计算
。使代码可编译:

[Test]
public void ShoulReturnHoonWhenValueDivisibleOnlyBy3()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(3);
    Assert.AreEqual("HOON", result);
}
现在您的测试失败了,因为您返回的是空字符串。只需硬编码“HOON”即可通过测试。TDD也可以

public class HoonGroup
{
    public string Calculate(int value)
    {
        return "";
    }
}
下一个测试:

public class HoonGroup
{
    public string Calculate(int value)
    {
        return "HOON";
    }
}
当然,测试失败了。更新实施:

[Test]
public void ShoulReturnGroupWhenValueDivisibleOnlyBy5()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(5);
    Assert.AreEqual("Group", result);
}
看起来很愚蠢。但它实现了代码的所有要求。另一项测试:

public class HoonGroup
{
    public string Calculate(int value)
    {
        return (value == 5) ? "Group" : "HOON";
    }
}
没问题-添加另一个条件:

[Test]
public void ShoulReturnNullWhenValueIsNotDivisibleBy3Or5()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(5);
    Assert.IsNull(result);
}
测试通过了。我们需要更多的测试用例。使用NUnit很容易-只需使用属性()装饰第一个测试:

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

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

我想你明白TDD的要点和规律了。为可被5整除的值创建更多的测试用例,并为可被3和5整除的值编写测试。

您不能从现有代码编写测试驱动的代码,因为测试应该在编写实现之前编写

测试代码的最简单方法是向控制台提供
TextWriter
mock.Out
并验证生成的输出

更新:如果你想使用TDD,那么你应该修改你的代码使其可测试。在这里,您的
程序
类做了很多事情——它负责表示(将结果输出到控制台)和业务逻辑(计算值)。为了测试业务逻辑,您应该将此功能移动到单独的类中

让我们开始吧。第一次测试:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
    }
}
它无法编译,因为您没有
HoonGroup
类。创建类,创建方法
计算
。使代码可编译:

[Test]
public void ShoulReturnHoonWhenValueDivisibleOnlyBy3()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(3);
    Assert.AreEqual("HOON", result);
}
现在您的测试失败了,因为您返回的是空字符串。只需硬编码“HOON”即可通过测试。TDD也可以

public class HoonGroup
{
    public string Calculate(int value)
    {
        return "";
    }
}
下一个测试:

public class HoonGroup
{
    public string Calculate(int value)
    {
        return "HOON";
    }
}
当然,测试失败了。更新实施:

[Test]
public void ShoulReturnGroupWhenValueDivisibleOnlyBy5()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(5);
    Assert.AreEqual("Group", result);
}
看起来很愚蠢。但它实现了代码的所有要求。另一项测试:

public class HoonGroup
{
    public string Calculate(int value)
    {
        return (value == 5) ? "Group" : "HOON";
    }
}
没问题-添加另一个条件:

[Test]
public void ShoulReturnNullWhenValueIsNotDivisibleBy3Or5()
{
    var hoonGroup = new HoonGroup();
    string result = hoonGroup.Calculate(5);
    Assert.IsNull(result);
}
测试通过了。我们需要更多的测试用例。使用NUnit很容易-只需使用属性()装饰第一个测试:

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

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

我想你明白TDD的要点和规律了。为可被5整除的值创建更多测试用例,并为可被3和5整除的值编写测试。

重写代码以使其可测试

顺便说一句,它看起来不对,所以我会这样写:

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

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

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

        var name = GetName(i);
        if (name != null)
        {
            Console.WriteLine(name);
        }
    }
}

internal static string GetName(int i)
{
    if (i % 3 == 0)
    {
        if (i % 5 == 0)
        {
            return "HOON Group";
        }
        else
        {            
            return "HOON";
        }
    }
    else if (i % 5 == 0)
    {
        return "Group";
    }
    else
    {
        return null;
    }
}

本例假设您已使用
内部visibletoAttribute
。如果不是,则将GetName
设置为公共的
。有关更多信息,请参见重写代码以使其可测试

顺便说一句,它看起来不对,所以我会这样写:

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

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

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

        var name = GetName(i);
        if (name != null)
        {
            Console.WriteLine(name);
        }
    }
}

internal static string GetName(int i)
{
    if (i % 3 == 0)
    {
        if (i % 5 == 0)
        {
            return "HOON Group";
        }
        else
        {            
            return "HOON";
        }
    }
    else if (i % 5 == 0)
    {
        return "Group";
    }
    else
    {
        return null;
    }
}

本例假设您已使用
内部visibletoAttribute
。如果不是,则将GetName
设置为公共的
。有关更多信息,请参见

如果您感兴趣,这就是如何使用TDD解决FizzBuzz(本质上是同一个问题)


如果您感兴趣,这就是使用TDD解决FizzBuzz(本质上是同一个问题)的方法


这是Fizz Buzz的新名字吗?这不应该被标记为
家庭作业
面试
?这是Fizz Buzz的新名字吗?这不应该被标记为
家庭作业
面试
?谢谢你的评论,如果我假设我知道我应该在这里写什么,我想先写测试,你能为上面的逻辑添加简单的例子吗?谢谢你的评论,如果我假设我知道我应该在这里写什么,我想先写测试,你能为上面的逻辑添加简单的例子吗?