我正在尝试学习如何进行单元测试和模拟。我了解 TDD 和基本测试的一些原则。但是,我正在考虑重构以下未经测试编写的代码,并试图了解它需要如何更改以使其可测试。
public class AgentRepository
{
public Agent Select(int agentId)
{
Agent tmp = null;
using (IDataReader agentInformation = GetAgentFromDatabase(agentId))
{
if (agentInformation.Read())
{
tmp = new Agent();
tmp.AgentId = int.Parse(agentInformation["AgentId"].ToString());
tmp.FirstName = agentInformation["FirstName"].ToString();
tmp.LastName = agentInformation["LastName"].ToString();
tmp.Address1 = agentInformation["Address1"].ToString();
tmp.Address2 = agentInformation["Address2"].ToString();
tmp.City = agentInformation["City"].ToString();
tmp.State = agentInformation["State"].ToString();
tmp.PostalCode = agentInformation["PostalCode"].ToString();
tmp.PhoneNumber = agentInformation["PhoneNumber"].ToString();
}
}
return tmp;
}
private IDataReader GetAgentFromDatabase(int agentId)
{
SqlCommand cmd = new SqlCommand("SelectAgentById");
cmd.CommandType = CommandType.StoredProcedure;
SqlDatabase sqlDb = new SqlDatabase("MyConnectionString");
sqlDb.AddInParameter(cmd, "AgentId", DbType.Int32, agentId);
return sqlDb.ExecuteReader(cmd);
}
}
这两个方法在一个类中。GetAgentFromDatabase 中的数据库相关代码与企业库相关。
我怎样才能使这个可测试?我应该将 GetAgentFromDatabase 方法抽象到不同的类中吗?GetAgentFromDatabase 是否应该返回 IDataReader 以外的内容?任何建议或指向外部链接的指针将不胜感激。