我正在学习单元测试。如何在VS 2010上对以下方法进行单元测试?
private string[] lstStrCalculatePoints()
{
string[] lstStrPoints = new string[2];
if (lblKPIAResult.Text.Contains("Exceeds"))
{
lstStrPoints[0] = "AHT";
}
if (lblKPIBResult.Text.Contains("Exceeds"))
{
lstStrPoints[1] = "QA";
}
return lstStrPoints;
}
请提供示例。谢谢!
答案 0 :(得分:5)
我会创建两个新方法:
public static string GetKpiPoint(string kpiResult, string ifExceeds)
{
return kpiResult.Contains("Exceeds") ? ifExceeds : null;
}
public static string[] CalculatePoints(string kpiAResult, string kpiBResult)
{
return new string[] { GetKpiPoint(kpiAResult, "AHT"), GetKpiPoint(kpiBResult, "QA") };
}
然后从你的出口人那里打电话:
private string[] lstStrCalculatePoints()
{
return CalcualtePoints(lblKPIAResult.Text, lblKPIBResult.Text);
}
编辑:测试此方法的方法取决于您的测试框架,但如果您使用的是NUnit,则可以执行以下操作:
[Test]
[TestCase("Exceeds", "Exceeds", new string[] { "AHT", "QA" })]
[TestCase("NoMatch", "NoMatch", new string[] { null, null })]
[TestCase("Exceeds", "NoMatch", new string[] { "AHT", null })]
[TestCase("NoMatch", "Exceeds", new string[] { null, "QA" })]
public void CalculatePointsTest(string kpiA, string kpiB, string[] expected)
{
CollectionAssert.AreEqual(expected, CalculatePoints(kpiA, kpiB));
}
答案 1 :(得分:0)
我不会直接测试私有方法。
通过测试调用私有方法的公共方法来间接测试它们。这是为了防止您破坏封装,它将允许您重构代码而无需不必要地更新您的测试。
只要公共接口按照定义工作,只要我完全测试公共接口的规范,我就不关心该类在幕后的作用。
PS:受保护的方法是一个不同的故事,但超出了问题的范围。
答案 2 :(得分:0)
从lblKPI<n>Result
属性我想你是在WinForm应用程序中,对吗?最好将表示逻辑与您的视图(lstStrCalculatePoints
所在的表单)分开,并将其放入Presenter(或类似的)中。阅读例如。模型 - 视图 - 演示者(MVP)或另一个MVC派生模式。在Presenter类上进行单元测试。