gpt4 book ai didi

c# - 对别名方法进行单元测试

转载 作者:行者123 更新时间:2023-11-30 17:45:38 25 4
gpt4 key购买 nike

单元测试只调用 2 个其他方法而没有逻辑的方法的最佳实践是什么?

internal ICollection<ObjA> FunctionA()
{
IEnumerable<ObjB> b = _factory.FunctionB();
return FunctionC(b);
}

_factory.FunctionB()FunctionC(b) 都有针对它的单元测试,所以如果这些方法坏了我们就会知道。

我正在考虑伪造这两个函数,并只进行单元测试以确保从 FunctionA() 调用这些方法。但是如果 FunctionB()FunctionC() 发生变化,FunctionA() 可能会变成误报。

最佳答案

我倾向于不对私有(private)或内部方法进行单元测试,因为它们应该在对公共(public) API 进行单元测试时执行。

假设这是一个公共(public)方法,我将进行测试,根据私有(private)成员 _factory 的状态检查调用 FunctionA() 时您期望的返回值。假设您可以控制 _factory 的输出(通过它是一个可模拟的接口(interface),可子类化的基类,或者只是用一个已知值简单实例化并传递给该类的构造函数),您可以确保获得预期的输出FunctionA 基于该初始输入。

如果您发现每次更新 FunctionB 或 FunctionC 时都会收到误报,我会质疑为什么 FunctionA 存在。更可能的情况是,在 FunctionA 上中断的单元测试将导致您更改 FunctionA 的内部实现,因为对 FunctionB 和 FunctionC 的更改不再使它们成为 FunctionA 的合适实现,或者它们将导致您为 FunctionA 添加单元测试这些函数修复了 FunctionA 中的间接破坏。

在这个特定示例中,FunctionA 似乎只是一个包装器,用于将 ObjB 转换为 ObjA,其数据源已由内部工厂类指定。对于这个特定场景,我会为 FunctionA 设置我的测试,这样如果上层需求发生变化(因为实现了关于如何将 ObjB 转换为 ObjA 的新规则),那么我可以根据哪个将新逻辑放在 FunctionA 或 FunctionC 中我觉得比较合适。

例子:

internal ICollection<ObjA> FunctionA()
{
IEnumerable<ObjB> b = _factory.FunctionB();
// in the future unit test may drive that a different implemetation is used
// based on some data about b.
if(b.SomeCondition())
return FunctionC(b);
else
return FunctionD(b);
}

或者可能是C需要改变

internal ICollection<ObjA> FunctionC(IEnumerable<ObjB> objBEnumerable)
{
ICollection<ObjA> objACollection = initializeCollection();
foreach(var objB in objBEnumerable)
{
//updated logic to create objA from objB goes here
objACollection.Add(createdObjA);
}
return objACollection;
}

基本上,您的问题的答案是“视情况而定”,但如果函数 B 和 C 的覆盖率已经很好,以防 A 需要在第一个代码示例中转移,我宁愿编写一个可能毫无意义的测试 future 。

关于c# - 对别名方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27257572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com