gpt4 book ai didi

unit-testing - 对没有返回值的类进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 23:32:03 24 4
gpt4 key购买 nike

我在关于这个特定问题的教程中没有找到太多内容..

所以我有一个名为“Job”的类,它具有公共(public)对象和一个公共(public) Run() 函数。类中的所有内容都是私有(private)的并封装在类中。 (你可能还记得这里的一篇较旧的帖子 Testing only the public method on a mid sized class? ,它的回复对我帮助很大)

这个 Run() 方法做了很多事情 - 将 Excel 文件作为输入,从中提取数据,向第三方数据供应商发送请求,获取结果并将其放入数据库并记录开头/工作结束。

该 Job 类在其 run 方法中使用 3 个独立的接口(interface)/类(IConnection 将连接到第三方供应商并发送请求,IParser 将解析结果,IDataAccess 将结果保存到数据库)。所以现在,我的 Run() 方法中唯一真正的逻辑是提取 excel 输入并将其发送到其他类的链中。我创建了 3 个模拟类,并在 Job 类 ctor 上使用 DI,一切都很好......

除了 - 我仍然对如何测试我的 Run() 方法有点迷失 - 因为它是无效的并且不返回任何内容......

在这种情况下,我是否应该向 Run() 方法添加一个返回值,以返回从 Excel 文件中提取了多少条记录?因为这是现在该函数中完成的唯一逻辑..这不会在实际代码中处理,而是在单元测试中处理...这对我来说似乎有点难闻 - 但就我而言,我是一个新手真正的 TDD 值得关注...

第二个问题 - 我应该创建一个名为 IExcelExtractor 的第四个类,它对我来说符合逻辑吗?或者这有点类(Class)爆炸??

即使我做了后者,如果我的 Run() 函数返回 void 并且它的所有工作都是由实际上什么都不做的模拟对象执行的,我将如何测试它?我可以理解我的函数是否有一个有意义的返回值...但在这种情况下我很困惑。

如果您已经读到这里,非常感谢您阅读所有内容。

最佳答案

你所描述的is often called behavior verification (与状态验证相对)。它有它的支持者和反对者,但对于几类类别来说,如果您想进行单元测试,它是唯一的游戏。

要对行为仅限于与协作者交互的类进行单元测试,您通常会传递模拟协作者对象,这些对象的检测方式允许您验证其方法是否已按照您期望的方式调用。

如果您要对问题中提到的类手动执行此操作(恶心!),您可以创建一个实现 IParser 并添加属性的 MockParser 类记录其方法是否被调用以及如何被调用。

最好使用模拟框架来动态创建模拟,指定对它们的期望,并验证这些期望。

我一直在使用NMock2这些天,测试看起来像这样:

// 'mockery' is the central framework object and Mock object factory
IParser mockParser = mockery.NewMock<IParser>();

// Other dependencies omitted
Job job = new Job(mockParser);

// This just ensures this method is called so the return value doesn't matter
Expect.Once.On(mockParser).
.Method("Parse").
.WithAnyArguments().
.Will(Return.Value(new object()));

job.Run();
mockery.VerifyAllExpectationsHaveBeenMet();

关于unit-testing - 对没有返回值的类进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1607339/

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