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);
}
答
就看你的代码,我有几个建议。
- 您不希望在单元测试中依赖外部资源(在本例中为数据库)。你的代码可以很好,但如果这个数据库关闭了,测试可能会失败。看看类似Repository Pattern的东西,并通过(或理想情况下使用Dependency Injection注入)存储库而不是连接字符串。使用这种方法,您可以使用“假”存储库,并且可以完全控制传回的数据,并且可以删除数据库的依赖关系。如果需要,您也可以单独测试您的存储库。
- 此代码看起来违反了单一责任原则,它负责数据访问和更新UI。调用存储库将从代码中删除数据访问并使其更容易测试。
我发现一个很好的指示你的代码是如何分离的是它是多么容易测试。如果您在测试代码时遇到困难,那么它可能会成为重构的候选人。
你是什么意思我面临的问题得到它的工作?你得到什么错误? – Liam 2012-07-20 10:57:17
@李安,没错。意思是说我面临的问题得到它的工作。 – kombo 2012-07-20 11:05:39
以下是错误:失败getQualWeightTest API测试\t测试方法API_TEST.ApisTest.getQualWeightTest引发异常: ... – kombo 2012-07-20 11:06:22