【发布时间】:2009-03-27 18:24:08
【问题描述】:
假设我有以下要测试的功能:
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
_emailService.SendEmail(order.User.Email, "Your order has been cancelled!");
}
现在,Order 类是 SubSonic 生成的类,其上的 User 属性是延迟加载的,这意味着当我调用 order.User.Email 时,它实际上会运行一条 SQL 语句来获取用户。
如果我想对此进行单元测试,我会遇到问题,因为我真的不希望我的单元测试访问我的数据库。
我目前的解决方案是将 CancelOrder 函数重构为如下所示:
public void CancelOrder(Order order)
{
order.Status = "Cancelled";
User user = _userRepository.GetByUserID(order.UserID);
_emailService.SendEmail(user.Email, "Your order has been cancelled!");
}
然后我可以删除 _userRepository.GetUserByID() 调用以返回硬编码的用户对象。
这是最好的方法吗?我猜你可能会说第二种实现更简洁,因为所有数据访问都是通过存储库完成的,而不是隐藏在属性中。
【问题讨论】:
标签: unit-testing orm subsonic tdd