【发布时间】:2010-06-01 08:30:00
【问题描述】:
我有以下代码:
private void SetControlNumbers()
{
string controlString = "";
int numberLength = PersonNummer.Length;
switch (numberLength)
{
case (10) :
controlString = PersonNummer.Substring(6, 4);
break;
case (11) :
controlString = PersonNummer.Substring(7, 4);
break;
case (12) :
controlString = PersonNummer.Substring(8, 4);
break;
case (13) :
controlString = PersonNummer.Substring(9, 4);
break;
}
ControlNumbers = Convert.ToInt32(controlString);
}
使用以下测试方法进行测试:
[TestMethod()]
public void SetControlNumbers_Length10()
{
string pNummer = "9999999999";
Personnummer target = new Personnummer(pNummer);
Assert.AreEqual(9999, target.ControlNumbers);
}
[TestMethod()]
public void SetControlNumbers_Length11()
{
string pNummer = "999999-9999";
Personnummer target = new Personnummer(pNummer);
Assert.AreEqual(9999, target.ControlNumbers);
}
[TestMethod()]
public void SetControlNumbers_Length12()
{
string pNummer = "199999999999";
Personnummer target = new Personnummer(pNummer);
Assert.AreEqual(9999, target.ControlNumbers);
}
[TestMethod()]
public void SetControlNumbers_Length13()
{
string pNummer = "1999999-9999";
Personnummer target = new Personnummer(pNummer);
Assert.AreEqual(9999, target.ControlNumbers);
}
出于某种原因,Visual Studio 说我有 1 个未测试的块,尽管被测方法中的所有代码都显示为蓝色(即代码包含在我的单元测试中)。这是因为我没有在开关中定义默认值吗?当调用 SetControlNumbers() 方法时,它所操作的字符串已经被验证并检查它是否符合规范,并且开关中的各种 Substring 调用将生成一个包含 4 个字符的字符串。我只是好奇为什么它说有 1 个未经测试的块。我根本不是单元测试专家,所以我很想对此提供一些反馈。
另外,除了添加 try-catch 块并检查 FormatExceptions 和 OverflowExceptions 之外,我如何改进切换后的转换以使其更安全?
【问题讨论】:
-
当数字为 13 时会发生什么?
-
不会调用此代码,因为在调用 SetControlNumbers 之前会引发异常。
-
switch语句中没有默认值
-
啊,你说的很对。我添加了一个默认方法和一个测试方法,我的代码覆盖率跃升至 100%。嗬!谢谢! :-) 写一个答案,我会接受的。
-
我怀疑 VS 能够解决这个问题。它只是看到一个缺失的
default。 (事实上,经验让我怀疑人类能否可靠地解决这个问题。)
标签: c# .net visual-studio unit-testing code-coverage