我一直在为业务逻辑层编写单元测试时遇到了一些麻烦,请指点我正确的方向。任何意见,将不胜感激。重构单元测试
业务逻辑
public class TitleLogic
{
private readonly TitleDAL titleDAL = new TitleDAL();
private readonly List<TitleEntity> titleEntities;
public TitleLogic()
{
titleEntities = titleDAL.GetAllTitles().ToList();
}
public TitleEntity InsertTitle(TitleEntity titleEntity)
{
if (!titleEntity.IsValid)
{
throw new EntityException<TitleEntity>("Invalid Title.", titleEntity);
}
titleEntity.TitleName.TrimSize(TitleEntity.TitleName_Length);
var createdTitle = titleDAL.InsertTitle(titleEntity);
titleEntities.Add(createdTitle);
return createdTitle;
}
public TitleEntity FindTitle(string titleName)
{
return titleEntities.Find(p => p.TitleName == titleName);
}
}
数据层
public class TitleDAL
{
private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public TitleEntity InsertTitle(TitleEntity titleEntity)
{
XTime900Entities xTime900Entities = new XTime900Entities();
//Find the next CodeId to use
var titleCodeId = xTime900Entities.TITLEs.Max(p => p.TITLE_CODEID) + 1;
TITLE title = new TITLE
{
TITLE_CODEID = (short) titleCodeId,
TITLE_ACTIVE = Convert.ToInt16(titleEntity.TitleActive),
TITLE_NAME = titleEntity.TitleName
};
xTime900Entities.TITLEs.InsertOnSubmit(title);
xTime900Entities.SubmitChanges();
logger.Debug("Inserted New Title CodeId: {0}", titleCodeId);
xTime900Entities.Dispose();
return titleEntity.Clone((short)titleCodeId);
}
public ICollection<TitleEntity> GetAllTitles()
{
logger.Debug("Retrieving List all Titles from XTime900 database.");
List<TitleEntity> titleEntities = new List<TitleEntity>();
using (XTime900Entities XTEntities = new XTime900Entities())
{
var titlesInDB = from p in XTEntities.TITLEs
select p;
foreach (var titlesInDb in titlesInDB)
{
TitleEntity genderEntity = new TitleEntity(titlesInDb.TITLE_CODEID)
{
TitleActive = Convert.ToBoolean(titlesInDb.TITLE_ACTIVE),
TitleName = titlesInDb.TITLE_NAME
};
titleEntities.Add(genderEntity);
}
}
logger.Debug("Found {0} Titles.", titleEntities.Count);
return titleEntities;
}
}
实体
public class TitleEntity
{
public const int TitleName_Length = 30;
public short TitleCodeId { get; private set; }
public bool TitleActive { get; set; }
public string TitleName { get; set; }
public bool IsValid
{
get
{
return !String.IsNullOrEmpty(TitleName);
}
}
public TitleEntity()
{
this.TitleCodeId = -1;
}
public TitleEntity(short titleCodeId)
{
this.TitleCodeId = titleCodeId;
}
public TitleEntity Clone(short titleCodeId)
{
TitleEntity genderEntity = new TitleEntity(titleCodeId)
{
TitleActive = this.TitleActive,
TitleName = this.TitleName
};
return genderEntity;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(String.Format("TitleCodeId : {0}", TitleCodeId));
sb.AppendLine(String.Format("TitleActive : {0}", TitleActive));
sb.AppendLine(String.Format("TitleName : {0}", TitleName));
return sb.ToString();
}
public static bool operator ==(TitleEntity x, TitleEntity y)
{
return (x.Equals(y));
}
public static bool operator !=(TitleEntity x, TitleEntity y)
{
return !(x.Equals(y));
}
public bool Equals(TitleEntity other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return other.TitleCodeId == TitleCodeId && other.TitleActive.Equals(TitleActive) && Equals(other.TitleName, TitleName);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
return obj.GetType() == typeof(TitleEntity) && Equals((TitleEntity)obj);
}
public override int GetHashCode()
{
unchecked
{
var result = TitleCodeId.GetHashCode();
result = (result * 397)^TitleActive.GetHashCode();
result = (result * 397)^(TitleName != null ? TitleName.GetHashCode() : 0);
return result;
}
}
}
+1,与我写的相同,结构/解释比例更好。 – 2011-04-04 11:43:17
太好了,这或多或少是我的目标。只是另一个q,我应该然后改变“私人只读TitleDAL titleDAL =新TitleDAL();”公开ITitleDAL titleDAL {get; set;}或在构造函数中传递它? – Jethro 2011-04-04 12:12:21
我想你应该通过它的构造函数。而且我不认为你应该让这个物业公开。如果依赖关系是可选的,那么你可以有一个属性,它可能会或可能不会被设置。在这种情况下,依赖是强制性的,所以你应该通过在构造函数中询问来显示它。 – 2011-04-04 12:14:03