2011-05-23 70 views
3

我有一个遗留类,我快速想要编写几个测试。不幸的是,我们在构造函数中有一个单例调用,目前没有足够的时间来重构它,因为它应该。在unmockable遗留代码中提供依赖关系

function __construct(){ 

    $this->_dbConnect = DbConnect::getInstance(); 
    // very long constructer (sigh) omitted below ... 
} 

它是可以接受的做法要做到这一点,这样才能有mockable遗留代码:如果你只需要测试这个类

function __construct(DbConnect $dbConnect = null){ 

    $this->_dbConnect = isset($dbConnect) ? $dbConnect : DbConnect::getInstance(); 

    // <snip> 
} 
+0

这是在[Sebastian Bergmann关于使用Singletons测试代码的博客文章]中建议的方法(http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html) – Gordon 2011-05-23 10:22:13

回答

1

- ,这是正常的代码。

对不起,1行的答案,但你的问题包含答案已经:)

+0

完全赞赏你的一班。我是TDD新手,在一个1人团队中,所以我只想验证我在应用这些方法时正确地走上正轨。 – stefgosselin 2011-05-23 10:28:30

2

它是可以接受的做法要做到这一点,这样才能有mockable遗留代码:

这是我想是一个好的开始。然后,如果您要重构整个应用程序,您可能需要考虑通过构造函数请求DatabaseConnection,并更改所有可能创建该对象的调用。如果您现在只专注于测试确切的课程,您的解决方案完全可以接受。

+0

+1谢谢!将在即将发布的版本中安排重构。我只需要安装单元测试库并准备为这个应用程序咆哮,但有一些时间留在几个测试弹出。 ; O) – stefgosselin 2011-05-23 10:32:38