【发布时间】:2013-04-25 06:05:37
【问题描述】:
相对问题可能是这样的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
}
}
}
注意:请忽略逻辑架构(例如:关于在验证期间不抛出异常等)
【问题讨论】:
-
请提供一些示例代码。如果您测试 ClassA,我认为模拟 ClassB 是有意义的,这样您就不必依赖外部世界,这正是我们在单元测试中想要的。当你所有的单元测试最终都通过时,你应该考虑集成测试。
-
@MarcoForberg 我已经为此更新了一个真实的案例实现。也许它可以帮助理解这个案例。
标签: unit-testing testing dependency-injection automated-tests