【发布时间】:2010-12-09 02:30:37
【问题描述】:
我在关于这个特定问题的教程中没有找到太多内容..
所以我有一个名为“Job”的类,它具有公共 ctor 和一个公共 Run() 函数。类中的所有内容都是私有的并封装在类中。 (您可能还记得 Testing only the public method on a mid sized class? 上的一篇较早的帖子,回复对我帮助很大)
这个 Run() 方法做了很多事情 - 将一个 excel 文件作为输入,从中提取数据,向第三方数据供应商发送请求,获取结果并将其放入数据库并记录开始/ 工作结束。
此 Job 类在其 run 方法中使用 3 个单独的接口/类,(IConnection 将连接到第三方供应商并发送请求,IParser 将解析结果,IDataAccess 将结果保存到数据库)。所以现在,我的 Run() 方法中唯一真正的逻辑是提取 excel 输入并将其发送到其他类的链中。我创建了 3 个模拟类并在 Job 类 ctor 上使用 DI,一切都很好而且花花公子......
除了 - 我仍然对如何测试我的 Run() 方法有点迷茫 - 因为它是无效的并且不返回任何东西......
在这种情况下,我是否应该在 Run() 方法中添加一个返回值,以返回从 Excel 文件中提取了多少条记录?因为这是现在在该函数中完成的唯一逻辑..这不会在实际代码中处理,但会在单元测试中......这对我来说似乎有点臭 - 但我是一个新手真正的TDD是关心...
第二个问题 - 我应该创建一个名为 IExcelExtractor 的第四个类,它为我做这个逻辑吗?还是这有点阶级爆炸??
即使我做了后者,如果我的 Run() 函数返回 void 并且它的所有工作都是由实际上什么都不做的模拟对象执行的,我将如何测试我的 Run() 函数?我可以理解我的函数是否有一个有意义的返回值......但在这种情况下,我很困惑。
非常感谢您阅读了这一切,如果您能做到这一点。
【问题讨论】:
-
吹毛求疵:您的 IDataAccess 不应该被称为 IPersistResults 或类似的名称吗???
-
IDataAccess 也会执行 Saves() 和 Selects()... 术语 Persist 的意思是“保存”但没有 Select...?
标签: unit-testing tdd mocking