我有以下代码:
public interface IProductDataAccess
{
bool CreateProduct(Product newProduct);
}
Class ProductDataAccess
实现该接口。
public class ProductBusiness
{
public bool CreateProduct(Product newProduct)
{
IProductDataAccess pda = new ProductDataAccess();
bool result = pda.CreateProduct(newProduct);
return result;
}
}
在这种情况下,如何创建单元测试CreateProduct
方法通过模拟IProductDataAccess
界面?我想过有一个公共实例IProductDataAccess
within ProductBusiness
并使用初始化它Mock<IProductDataAccess>
对象,但将数据访问暴露给 UI 层并不是一个好习惯。谁能帮我?
经典示例表明,如果您无法对特定组件进行单元测试,请重构它!
这就是为什么我喜欢任何模拟框架强制你做的事情——编写解耦代码。
在你的例子中,ProductBusiness
类与ProductDataAccess
班级。您可以使用依赖注入(就像大多数答案所建议的那样)将其解耦。通过这样做,您最终将取决于IProductDataAccess
抽象而不是它的任何具体实现。
另一点需要注意的是,当您为业务层编写测试/规范时,您通常希望测试“行为”而不是“状态”。因此,尽管您可以断言验证是否返回“true”,但您的测试应该真正测试使用 MOQ 设置的预期数据访问调用是否实际使用.Verify
最小起订量API。
尝试在您期望数据访问层抛出异常(使用“.Throws”API)的地方添加行为测试,并检查业务层是否需要任何特殊处理。
就像凯文建议的那样,以下实施ProductBusiness
将工作:
public class ProductBusiness
{
private readonly IProductDataAccess _productDataAccess;
public ProductBusiness(IProductDataAccess productDataAccess)
{
_productDataAccess = productDataAccess;
}
public bool CreateProduct(Product newProduct)
{
bool result=_productDataAccess.CreateProduct(newProduct);
return result;
}
}
并使用任何 xunit 测试框架将测试编写为:
var mockDataAccess = new Mock<IProductDataAccess>();
mockDataAccess.Setup(m => m.CreateProduct(It.IsAny<Product>())).Returns(true);
var productBusiness = new ProductBusiness(mockDataAccess.Object);
//behavior to be tested
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)