现在的位置: 首页 > 综合 > 正文

TDD by example (6) — 无招

2011年03月09日 ⁄ 综合 ⁄ 共 5546字 ⁄ 字号 评论关闭
文章目录

继续我们的TDD,还是先看to-do list

  随机生成答案

  检查输入是否合法 

  判断猜测结果

  记录历史猜测数据并显示 

  判断猜测次数,如果满6次但是未猜对则判负 
  如果4个数字全中,则判胜
  
  实现IRandomIntGenerator 
  实现IGameHistory
  显示猜测纪录

检查输入是否合法

还是测试先行

[Test]
public void should_return_true_when_input_is_valid()
{
    InputValidator validator 
= new InputValidator();
    Assert.That(validator.Validate(
"1 2 3 4"), Is.True);
}

还是先写功能代码让编译通过,然后运行测试,红了,接着把功能代码写完让测试变绿

public class InputValidator
{
    
public bool Validate(string input)
    {
        
return true;
    }
}

这里我只是简单的返回了true,第一,我现在的任务就是让测试通过,而返回true就已经满足条件了;第二因为我们还没写输入错误的测试,因此不需要先考虑错误的情况。
接下来写几个测试输入错误的测试,先写一个测试输入元素数量多于4个的测试,顺便把validator的构造提取到setup里

private InputValidator validator;
[SetUp]
public void Setup()
{
    validator 
= new InputValidator();
}
[Test]
public void should_return_false_when_input_has_more_numbers_than_four()
{
    Assert.That(validator.Validate(
"1 2 3 4 5"), Is.False);
}

public bool Validate(string input)
{
    
string[] numbers = input.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries);
    
if (numbers.Length > 4)
    {
        
return false;
    }
    
return true;
}

再写一个输入元素少于4个的

[Test]
public void should_return_false_when_input_has_less_numbers_than_four()
{
    Assert.That(validator.Validate(
"1 2 3"), Is.False); 
}

public bool Validate(string input)
{
    
string[] numbers = input.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries);
    
if (numbers.Length != 4)
    {
        
return false;
    }
    
return true;
}

下面测试输入的元素是不是都是整数

[Test]
public void should_return_false_when_input_contains_non_number()
{
    Assert.That(validator.Validate(
"1 d 3 4"), Is.False);
}

public bool Validate(string input)
{
    
string[] numbers = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    
if (numbers.Length != 4)
    {
        
return false;
    }
    
foreach (var num in numbers)
    {
        
int result;
        
if (!int.TryParse(num, out result))
        {
            
return false;
        }
    }
    
return true;
}

测试输入的数是否在0-9之间

[Test]
public void should_return_false_when_input_nunbers_is_not_between_zero_and_nine()
{
      Assert.That(validator.Validate(
"1 2 10 -1"), Is.False);
}

public bool Validate(string input)
{
    
string[] numbers = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    
if (numbers.Length != 4)
    {
        
return false;
    }
    
foreach (var num in numbers)
    {
        
int result;
        
if (!int.TryParse(num, out result))
        {
            
return false;
        }
        
if (result < 0 || result > 9)
        {
            
return false;
        }
    }
    
return true;
}

测试输入的数是否有重复的

[Test]
public void should_return_false_when_input_contains_repeat_nunbers()
{
    Assert.That(validator.Validate(
"1 1 2 3"), Is.False);
}

写代码通过测试并重构

Code

实现IGameHistory

Test

 

Code

实现IRandomIntGenerator 

Code

 这里并没有再写测试了,一个原因是这个类比较简单,另一个原因是它的主要逻辑都委托给了标准库,而且Random很难测试。

Todo-list
  随机生成答案

  检查输入是否合法 

  判断猜测结果

  记录历史猜测数据并显示 

  判断猜测次数,如果满6次但是未猜对则判负 
  如果4个数字全中,则判胜
  
  实现IRandomIntGenerator 
  实现IGameHistory
  将所有连接起来(显示猜测纪录

我们已经完成了大部分工作,各个功能模块(类)都已经搭建出来,最后一步就是将他们连接起来形成完整的程序。

抱歉!评论已关闭.