假设您正在编写Yahtzee游戏TDD风格。您要测试代码部分,确定一组五个压模辊是否满座。据我所知,在进行TDD时,您遵循以下原则:
- 首先编写测试
- 写出最简单可行的方法
- 优化和重构
因此,初始测试可能如下所示:
public void Returns_true_when_roll_is_full_house()
{
FullHouseTester sut = new FullHouseTester();
var actual = sut.IsFullHouse(1, 1, 1, 2, 2);
Assert.IsTrue(actual);
}
当遵循“写出可能的最简单的IsFullHouse
方法”时,您现在应该这样编写方法:
public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
{
return true;
}
return false;
}
这将导致绿色测试,但实现不完整。
您是否应该对整个房屋进行每个可能的有效组合(值和位置)的单元测试?看来,这是绝对确保您的IsFullHouse
代码已经过完全测试和正确的唯一方法,但这听起来也很疯狂。
您将如何对此类内容进行单元测试?
更新资料
Erik和Kilian指出,在初始实现中使用文字以获得绿色测试可能不是最好的主意。我想解释为什么这样做,而该解释不适合评论。
我在单元测试(尤其是使用TDD方法)方面的实践经验非常有限。我记得在Tekpub上观看过Roy Osherove的TDD Masterclass录音。在其中一集中,他构建了String Calculator TDD风格。字符串计算器的完整规范可以在这里找到:http : //osherove.com/tdd-kata-1/
他从这样的测试开始:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
这导致该Add
方法的第一个实现:
public int Add(string input)
{
return 0;
}
然后添加此测试:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
并Add
重构了该方法:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
每一步之后,罗伊都会说“写出最简单的方法”。
因此,我想尝试制作TDD风格的Yahtzee游戏时会尝试这种方法。
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)