假设我有以下要测试的功能:
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() 调用以返回硬编码的用户对象。
这是最好的方法吗?我猜你可能会说第二种实现更干净,因为所有数据访问都是通过存储库完成的,而不是隐藏在属性中。