使用测试优先方法开发用户界面
2008-01-19 20:24:54 来源:WEB开发网5、Mock Objects
在删除操作的单元测试中,我们遇到的一个问题是,影片列表的数据应该是保存在一个文本文件或者数据库当中的,如果我们编写的测试依赖于这些实际的文件或数据库,那么我们的测试就会受制于这些外部的资源。一旦文件或者数据库里的数据发生变化,必然会波及到我们的测试代码,从而产生错误的测试信息。前面的MovieListEditor中我们没有加入一些初始化的数据,在测试删除操作时会遇到一些问题 。
这里,我们引入Mock Objects。Mock Objects用来模拟外部复杂的资源(如数据库,网络连接等),使UI可以测试那些依赖于这些复杂外界资源的模块。例如在测试一个跟数据库有关系的模块时,我们并不一定要建立一个真实的数据库连接,而只需建立一个Mock Objects就可以了。测试所需的数据都存在于这个Mock Objects。可以说,Mock Objects为我们提供了一个轻量级的、可控制的、高效的模型。
在本例中,影片的增加、删除都会跟文件或数据库操作发生关系。这时我们就可以利用Mock Objects来隔离测试代码与文件或数据库。使用Mock Objects一般有以下几个步骤:
a)、定义一个外部资源的接口.(这个接口一般是可以在重构过程中提炼出来的)。
b)、定义一个Mock Objects,从外部资源的接口继承下来,实现外部资源的接口。
c)、创建一个Mock Objects,并设置它的内部期望值。
d)、把创建的这个Mock Objects传递给需要测试的模块进行操作。
e)、操作完毕后将Mock Objects内部的状态与期待状态比较。 现在我们就根据这个步骤来实现本例子中的Mock Objects.通过对前面的代码进行重构,我们可以提炼出一个接口MovieListEditor:
class AFX_EXT_CLASS MovieListEditor
{
public:
MovieListEditor();
virtual ~MovieListEditor();
public:
virtual CStringArray* GetMovies()=0;
virtual void Add(CString strMovie)=0;
virtual void Delete(int nIndex)=0;
};
更多精彩
赞助商链接