Visual Studio 2010中的单元测试

问题描述:

显然,我一直在努力测试开发人员在Ourteam中构建的应用程序。 The Class:Apis,从user.I中读取连接字符串,id和错误消息。返回一个值名称和Qualification权重的字典。因为我是一个新手测试中遇到很多问题以使测试按预期工作。请告知我没有做错什么。
类:Visual Studio 2010中的单元测试

public class Apis 
{ 

    public Dictionary<String, String> getQualWeight(String sqlConStr, String inBin, Label lblResults) 
    { 
     Dictionary<String, String> qualList = new Dictionary<string, string>(); 
     string selectSQL = "select Name,qual_weight from Qualification_type " 
          + "where ID in (select Qualification_ID from Qualifications where BIN = @inBin)"; 
     con = getConn(sqlConStr); 
     SqlCommand cmd = new SqlCommand(selectSQL, con); 
     cmd.Parameters.AddWithValue("@inBin", inBin); 
     SqlDataReader reader; 
     try 
     { 
      con.Open(); 
      reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       qualList.Add(reader[0].ToString(), reader[1].ToString()); 
      } 
      reader.Close(); 
      return qualList; 
     } 
     catch (Exception err) 
     { 
      lblResults.Text = "error fetching qualification weight " + err.Message; 
      return null; 
     } 
     finally 
     { 
      con.Close(); 
     } 
    }  

我的测试:

[TestMethod()] 
    public void getQualWeightTest() 
    { 
     Api target = new Api(); 
     string sqlConStr = "SERVER=ABC123; Database=DB; UID=id; PWD=passme;encrypt=no;enlist=false"; 
     string inBin = "2012-52-456"; 
     Label lblResults = null; 

     lblResults.Text = " Failed"; 
     Dictionary<string, string> expected = new Dictionary<string,string>(); 
     expected.Add("Gohn", "50"); 
     Dictionary<string, string> actual; 
     actual = target.getQualWeight(sqlConStr, inBin, lblResults); 
     Assert.AreEqual(expected, actual); 

    } 
+1

你是什么意思我面临的问题得到它的工作?你得到什么错误? – Liam 2012-07-20 10:57:17

+0

@李安,没错。意思是说我面临的问题得到它的工作。 – kombo 2012-07-20 11:05:39

+0

以下是错误:失败getQualWeightTest API测试\t测试方法API_TEST.ApisTest.getQualWeightTest引发异常: ... – kombo 2012-07-20 11:06:22

就看你的代码,我有几个建议。

  1. 您不希望在单元测试中依赖外部资源(在本例中为数据库)。你的代码可以很好,但如果这个数据库关闭了,测试可能会失败。看看类似Repository Pattern的东西,并通过(或理想情况下使用Dependency Injection注入)存储库而不是连接字符串。使用这种方法,您可以使用“假”存储库,并且可以完全控制传回的数据,并且可以删除数据库的依赖关系。如果需要,您也可以单独测试您的存储库。
  2. 此代码看起来违反了单一责任原则,它负责数据访问和更新UI。调用存储库将从代码中删除数据访问并使其更容易测试。

我发现一个很好的指示你的代码是如何分离的是它是多么容易测试。如果您在测试代码时遇到困难,那么它可能会成为重构的候选人。

+0

我对数据库有完全的控制权,并且正在运行。 – kombo 2012-07-20 11:27:47

+1

这是一个通用的例子,单元测试不应该依赖任何外部资源。 – Fermin 2012-07-20 11:49:00