【发布时间】:2010-12-03 03:33:06
【问题描述】:
我目前正在使用 C# 进行开发 - 以下是一些背景: 我们使用客户端应用程序实现 MVP,并且我们有一个圈规则,该规则规定任何方法的圈复杂度都不应大于 5。 这导致了很多小的私有方法,它们通常只负责一件事。
我的问题是关于单元测试一个类:
通过公共方法测试私有实现一切都很好......我实现这个没有问题。
但是……以下情况呢:
示例 1. 处理异步数据检索请求的结果(回调方法不应纯粹为了测试而公开)
示例 2. 执行操作的事件处理程序(例如更新视图标签的文本 - 我知道的愚蠢示例...)
示例 3. 您正在使用第三方框架,该框架允许您通过覆盖受保护的虚拟方法进行扩展(从公共方法到这些虚拟方法的路径通常被视为黑盒编程,并将有框架提供的各种你不想知道的依赖)
在我看来,上面的例子并不是设计不佳的结果。 它们似乎也不适合转移到单独的类进行单独测试,因为这些方法将失去它们的上下文。
有人对此有任何想法吗?
干杯, 杰森
编辑: 我认为我最初的问题不够清楚 - 我可以使用访问器测试私有方法并使用 TypeMock 模拟调用/方法。那不是问题。问题是测试不需要公开或不能公开的东西。
我不想为了测试而公开代码,因为它可能会引入安全漏洞(仅发布一个接口来隐藏这不是一种选择,因为任何人都可以将对象转换回其原始类型并获得访问权限的东西我不希望他们)
重构到另一个类进行测试的代码很好 - 但可能会丢失上下文。我一直认为拥有“帮助器”类是不好的做法,它可以包含一堆没有特定上下文的代码——(在这里考虑 SRP)。我真的认为这也不适用于事件处理程序。
我很高兴被证明是错误的 - 我只是不确定如何测试此功能!我一直认为如果它可以破坏或改变 - 测试它。
干杯,杰森
【问题讨论】:
-
你将使用什么隔离框架?
-
我正在使用 Typemock 隔离器。模拟方法调用很容易 - 我真的不喜欢这样做,因为它会改变被测试类的行为!
-
所有这一切让我希望我可以从头开始编写自己的框架,这样我就可以从一开始就设计这些问题!!!
标签: c# testing methods tdd private