如何单元测试此方法

时间:2014-04-11 19:27:22

标签: c# unit-testing

我正在学习单元测试。如何在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;
}

请提供示例。谢谢!

3 个答案:

答案 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类上进行单元测试。