Visual Studio 2010中的单元测试

时间:2012-07-20 10:55:37

标签: visual-studio-2010 unit-testing

显然,我一直在努力测试开发人员在我的Ourteam中构建的应用程序。 类:Apis,从用户读取连接字符串,id和错误消息。我返回值名称和资格权重的字典。因为我是测试中的新手,面临很多问题,让我的测试按预期工作。请告知在哪里我没做错。
类:

 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 个答案:

答案 0 :(得分:2)

只是看看你的代码,我有几点建议。

  1. 您不希望在单元测试中依赖外部资源(在本例中为数据库)。您的代码可能没问题,但如果此数据库关闭,测试可能会失败。查看Repository Pattern之类的内容并传入(或理想地使用Dependency Injection注入)存储库而不是连接字符串。使用此方法,您可以使用“假”存储库,您可以完全控制传回的数据,并删除对数据库的依赖性。如果需要,您还可以单独测试存储库。
  2. 此代码看起来违反了单一责任原则,它负责数据访问和更新UI。调用存储库将从代码中删除数据访问并使其更容易测试。
  3. 我找到了一个很好的指标,表明你的代码是如何分离的,它是多么容易测试。如果您在测试代码时遇到困难,那么它可能是重构的候选者。