【发布时间】:2010-06-11 16:56:02
【问题描述】:
我最近刚读到关于单元测试的“模拟对象”,目前我在我的应用程序中实现这种方法时遇到了困难。请让我解释一下我的问题。
我有一个 User 模型类,它依赖于 2 个数据源(数据库和 facebook 网络服务)。控制器类只是将这个User 模型用作访问数据的接口,它并不关心数据的来源。
目前我从未对此User 模型进行任何单元测试,因为它依赖于外部Web 服务。但就在不久前,我读到了关于对象模拟的文章,现在我知道它是一种对依赖于外部资源的类进行单元测试的常用方法(就像我的例子一样)。
现在我想为User 模型创建一个单元测试,但是我遇到了一个设计问题:
为了让User 模型使用模拟的 Facebook SDK,我必须将这个模拟的 Facebook SDK 注入到用户对象(可能使用 setter)。因此,我无法在 User 对象中构造 Facebook SDK。我必须在用户对象之外构建它,并将 SDK 注入到用户对象中。
我的User 模型的真正客户端是应用程序的控制器。因此,我必须在控制器内部构建 Facebook SDK 并将其注入用户对象。嗯,这是一个问题,因为我希望我的控制器尽可能干净。我希望我的控制器不知道应用程序的数据源。
我不擅长系统地解释一些事情,所以你可能会在阅读最后一段之前睡觉。但是无论如何,我想问一下这里是否有人遇到过和我一样的问题?你如何解决这个问题?
问候, 安德烈
P.S:我使用的是 Zend 框架,PHP 5.3。
【问题讨论】:
标签: unit-testing dependency-injection mocking