相对的问题可能像this one question。
我使用依赖注入作为我的应用程序的架构。然后我为它创建了单元测试。
注入架构可能是这样的:
IClassA(IClassB)
IClassB(IClassC1, IClassC2)
//more of it
请注意,此架构仅涉及服务对象,而不涉及存储库。现在我想知道,要测试什么类。
如果我测试 C1 和 C2 类(最小的类),则不测试 B 类和 A 类。
如果我只测试A类(集成类),那么需要覆盖的场景太多,而不是很多小模块。
如果我测试 A 类的模块,并测试 C1 和 C2 类,我认为这似乎是多余的。如果我想重构一个逻辑(在开发过程中),我需要管理许多测试单元。
如果我用模拟类 B 测试 A 类,它将为每个类和模拟类创建几乎 1:1。它不会造成太多的嘲笑吗?
任何建议或想法将不胜感激。
编辑:
一个工作场景是当我想提供文件信息(基于 csv 或 xml),然后转换为实体时。该过程将是:
- ClassA 读取数据,将其作为大表格式(可能在 DataTable 中)传递给 ClassB
- ClassB 使用 ClassC1 进行验证
- ClassB 使用 ClassC2 进行更多验证,然后返回标头细节映射实体。
类的示例代码将是这样的(我跳过了构造函数注入部分):
public class ClassA: IClassA{
public IEnumerable<Request> GetRequestFromFile(FileInfo info
, ref ValidationResult validationResult){
//read the file and get DataTable
iClassB.ConvertToRequest(dataTableResult, ref validationResult);
}
}
public class ClassB : IClassB{
public IEnumerable<Request> ConvertToRequest(DataTable dt
, ref ValidationResult validationResult){
foreach(DataRow row in dt.Rows){
// convert to flat request first, to avoid reading DataTable too much
iClassC1.Validate(rawRequest, ref validationResult);
iClassC2.Validate(rawRequest, ref validationResult);
}
if(validationResult.IsSuccess){
// convert and return the header-detail entity object
}
}
}
注意:请忽略逻辑架构(例如:关于在验证期间不抛出异常等)