2015-05-09 64 views
-1

您好我想知道我怎么能单元测试下面的方法:单元测试这些方法?

public float calcNP() 
    { 

     int rowcount = dataGridView1.Rows.Count; 

     int[] colB = new int[rowcount]; 
     float[] NP = new float[rowcount]; 
     float avgNP = 0; 
     for (int i = 0; i < rowcount; i++) 
     { 
      colB[i] = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value); 


     } 

     float min = colB.Min(); 
     float max = colB.Max(); 
     float a = 1, b = 10; 

     for (int i = 0; i < rowcount; i++) 
     { 
      NP[i] = (a + (colB[i] - min) * (b - a))/(max - min); 
      avgNP = NP[i] + avgNP; 



     } 

     avgNP = (avgNP/rowcount) * 100; 
     return avgNP; 
    } 

,并以下

public float calcIFact() 
    { 

     float ftp = calcFTP(); 
     float NP = calcNP(); 
     float IntFact = NP/ftp; 

     return IntFact; 


    } 

public float calcFTP() 
    { 

     float ftp = 0; 

     if (chkFTP.Checked == true) 
     { 
      // ftp =(float)Convert.ToDouble(txtFTP.Text)/100; 
      ftp = (float)Convert.ToDouble(txtFTP.Text); 

     } 

     if (chkFTP.Checked == false) 
     { 
      int rowcount = dataGridView1.Rows.Count; 

      int[] colB = new int[rowcount]; 


      for (int i = 0; i < rowcount; i++) 
      { 
       colB[i] = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value); 


      } 
      // ftp = colB.Max()/100; 

      ftp = colB.Max(); 
     } 

如果有人能够给我一些例子,会很好。

基本上只需要计算

+12

您将很难单元测试依赖于数据网格中的值的方法。将计算逻辑移到单独的方法中,将数字作为输入并且不引用数据网格,然后单元测试这些方法。 –

+0

好的,没有多少时间来摆弄它,只需要为整个项目创建一些测试。单元测试一些图表功能有多难? – mvoase

+3

@ user2913240编写好的单元测试需要投入时间和重构代码来支持良好的测试实践。 BJ Myers告诉你一个处理重构的好方法。当前编写的方法依赖于您想要测试的方法范围之外的状态。这使得它很难测试。单元测试就是验证对于一组特定的输入,您会收到一组特定的输出。 –

回答

0

在该方法的当前状态,一些简单的测试,单元测试都将需要手动创建DataGrid对象和填充值按您的测试场景。正如Daniel所建议的,你的方法“public float calcNP()”不应该使用数据网格,而是你可以传递一个整数数组到方法中(只传递你将用于计算的值)

2

我们告诉你这样做:

// New method, not depending on a gridview. Testable. 
public float calcNP_pure(int[] colB) 
{ 
    float[] NP = new float[colB.Length]; 
    float avgNP = 0; 

    float min = colB.Min(); 
    float max = colB.Max(); 
    float a = 1, b = 10; 

    for (int i = 0; i < rowcount; i++) 
    { 
     NP[i] = (a + (colB[i] - min) * (b - a))/(max - min); 
     avgNP = NP[i] + avgNP; 
    } 

    avgNP = (avgNP/rowcount) * 100; 
    return avgNP; 
} 

// Not testable 
public float calcNP() 
{ 
    int rowcount = dataGridView1.Rows.Count; 
    int[] colB = new int[rowcount]; 
    for (int i = 0; i < rowcount; i++) 
    { 
     colB[i] = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value); 
    } 
    return calcNP_pure(colB); 
} 

这种新的方法也应该进入一个新的类,而不是坐在形式或其他一些UI元素上。最好的做法是对程序对接口和需要的依赖注入的对象:

public interface INpCalculator 
{ 
    float CalcNP(int[] values); 
} 

public class NpCalculator : INpCalculator 
{ 
    public float CalcNP(int[] values) 
    { 
     ... 
     return ...; 
    } 
} 

public partial class Form1 : Form 
{ 
    private INpCalculator _npCalculator; 

    public Form1(INpCalculator npCalculator) 
    { 
     InitializeComponent(); 
     _npCalculator = npCalculator; 
    } 

    private float CalcNP() 
    { 
     int[] colB = dataGridView1.Rows 
      .Cast<DataGridViewRow>() 
      .Select(row => row.Cells[5].Value) 
      .ToArray(); 
     return _npCalculator.CalcNP(colB); 
    } 
} 

现在的计算器,无需打开任何形式的可测试:

[TestMethod] 
public void TestNpCalculator() 
{ 
    // Arrange 
    var sut = new NpCalculator(); 
    var values = new int[] { 12, 7, 15, 3 }; 

    // Act 
    float result = sut.CalcNP(values); 


    // Assert 
    Assert.AreEqual(123.456f, result); 
} 

BTW:sut代表“被测系统“。