[英]Unit test method with mock DAL, but underlying method calls different (real) DAL
我正在尝试在当前项目中实施单元测试。 之后,我将开始在该项目中进一步使用TDD进行开发。 昨天我开始进行一些测试,但它并不像理论/书籍中那样容易。
目前,我正在为一个特定的场景而苦苦挣扎,我知道过去也必须有人与之合作。
一些背景资料。 我在类AddProduct
有一个名为Add()
的方法。 当将新对象传递给Add
方法时,必须首先创建一个新Item,所以我必须首先调用AddItem
类的Add()
方法。 所有这些代码都存在于业务层中。 当然,真正的添加发生在DAL中,这在我的AddProduct
和AddItem
类中调用。
到目前为止,我的想法是:
public class AddProduct : Product<IDataAccessAdd<Entities.Product>>, IBusinessAdd<Entities.Product>
{
private readonly Business.IBusinessAdd<Entities.Item> _addItem;
public AddProduct() : base(new DataAccess.AddProduct())
{
_addItem = new AddItem();
}
public AddProduct(DataAccess.IDataAccessAdd<Entities.Product> dal, Business.IBusinessAdd<Entities.Item> itemBl) : base(dal)
{
_addItem = itemBl;
}
private Entities.Product _newProduct;
public bool Add(ref Product product, string user)
{
bool isAdded = false;
_newProduct = product;
if(AddNewItem(user))
{
isAdded = Dal.Add(product);
}
return isAdded;
}
private bool AddNewItem(string user)
{
var newItem = new Item();
bool isAdded = _addItem.Add(ref newItem, user);
_newProduct.Item = newItem;
return isAdded;
}
}
如您所见,我正在从Add
方法中调用AddNewItem
。
此示例中的问题是构造函数。 我想要一个带有0或1参数的构造函数,如下所示:
public AddProduct() : base(new DataAccess.AddProduct())
{
}
public AddProduct(DataAccess.IDataAccessAdd<Entities.Product> dal) : base(dal)
{
}
以及类似的AddNewItem方法(或类似方法):
private bool AddNewItem(string user)
{
var newItem = new Item();
var addItem = new Business.AddItem();
bool isAdded = addItem.Add(ref newItem, user);
_newProduct.Item = newItem;
return isAdded;
}
但是在执行此操作时,在AddNewItem
方法中执行的代码使用了“真实的” DAL,因此我不希望在单元测试中使用它。 我通过向构造函数添加新参数来解决此问题,该构造函数还可以为Business.Item
类创建模拟DAL。 但是,我不认为这是要走的路。 从理论上讲,您可以获得具有20个参数的构造函数,所有这些参数都用于单元测试。 不是很漂亮的景象。
我的一位同事告诉我,可以使用“工厂方法”设计模式解决此问题,但他不确定这是否是最佳选择。 由于我从未使用过“工厂方法”设计模式,因此在单元测试对我来说也是新手时,我对实现它感到非常不自在。
我还有其他建议可以尝试吗?
您可以在此处使用两种方法。
设置专门用于测试的IOC容器。 在此容器中,您可以将dal服务配置为测试或模拟DAL服务。
手动连接课程。 在这种情况下,您将显式调用AddProduct构造函数并传递测试或模拟DAL服务。
其基本原理是依赖注入允许您创建一个沙箱来隔离和测试代码的特定部分。 上面的选项将创建该沙箱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.