作者:佚名
原文链接:http://googletesting.blogspot.tw/2007/10/tott-avoiding-friend-twister-in-c.html
在上一节课,我们在Python中提取方法来简化测试。这些提取的方法作为私有类成员是有用的,但是要如何编写产品代码使它不依赖于测试代码?在Python中这个很简单;但是在C++中,测试私有成员比扭扭乐需要更多的扭曲。
// my_package/dashboard.h class Dashboard { private: scoped_ptr<Database> database_; // 构造函数实例化 //声明函数GetResults(), GetResultsFromCache(), // GetResultsFromDatabase(), CountPassFail() friendclass DashboardTest;// 每个测试中声明一个friend // 固定的 };
可以通过提取类和提取接口的重构,用来创建一个包含实现的辅助类。在原始类的.h文件中提前声明新的接口,并且在原始类创建一个接口的指针。(这个和Pimpl惯用法类似。) 可以通过把标题分离成不同的子目录来区分公共API和和实现细节。(/my_package/public/ and/my_package/ in this example):
// my_package/public/dashboard.h
class ResultsLog; // 辅助性接口
classDashboard {
public: explicitDashboard(ResultsLog* results) : results_(results) { } private: scoped_ptr<ResultsLog> results_; };
// my_package/results_log.h classResultsLog { public: // 声明方法 GetResults(), // GetResultsFromCache(), // GetResultsFromDatabase(), CountPassFail() }; // my_package/live_results_log.h classLiveResultsLog : public ResultsLog { public: explicitLiveResultsLog(Database* database) : database_(database) { } };
现在不需要友元声明就可以测试 LiveResultsLog。当测试Dashboard 类的时候,也让你可以写入 MockResultsLog 实例。对原始类来说这些功能还是私有的, 并且对辅助类的使用可以对比较小的类更好的定位问题的所在。
词语解释:
1.Pimpl惯用法:基本思想是使用一个结构将原有接口class的私有数据成员和一些不希望被外界调用的数据成员操作的过程封装起来,此时class的私有成员看起来就想这样的:
private:
struct Member;
Member *data_member;
2.twister:一种游戏,叫做扭扭乐。