模板类 对模板类定义回调赋值,对该模板类的所有实例类有效,除非实例类本身定义了回调赋值。例如,VC的CList模板类定义了回调赋值,而CList<CToken*,CToken*>也定义了回调赋值,则,CList<int,
int>、CList<CString,CString>等等类型自动使用CList的回调赋值,CList<CToken*,CToken*>则使用自身的回调赋值。
用于模板类的回调赋值,在目标类型框中,不能填写模板形参,模板参数输入框会自动填写模板形参。用于模板实例类的回调赋值,则需添加完整的类名,如目标类型为CList,则对所有实例类有效,目标类型为CList<CToken*,CToken*>,则只对该类及其别名有效。
过渡类型可以引用模板参数中定义的类名,如下图中的TYPE。当不能确定过类型是否可能含有析构函数时,最好使用指针,如下图,过渡类型为TYPE*[16]。由于vcbData是局部变量,会自动析构,析构过程如果会调用析构函数,而析构函数会删除某些指针,且指针在测试过程中仍然需要使用,则会产生错误,虽然这种情形很少见,但很难查找,所以当不确定是否会产生此种情况时,最好使用指针
,使用指针不会增加数据表格中填写数据的难度。
|
|
|
在过渡类型中使用数组
过渡类型可以使用数组,数组在数据表中可以方便地赋值,而且可以用序列赋值功能方便地构建数组中的各项。在回调函数中,数组和其他集合的转换一般也很简单。由于单元测试是针对代码功能逻辑的测试,数据量通常不需要很大,数组的维数一般取16就可以了。如果维数很大,则数据表中会增加大量的行。
凡是使用了数组,都会自动添加以下变量: count_vcbData,数组计数变量,类型为long,如果过渡类型是数组,会在回调函数前面用#define的方式添加count_vcbData变量,表示数组中的有效项数。
count_xxx,数组计数变量,类型为long,如果过渡类型是复合类型,且复合类型的某些成员含有数组,则针对每个数组变量会添加数组计数变量。如过渡类型为{CString[16]
keys; int[16] indexs;},则会添加两个数组计数变量:count_keys,count_indexs。
数组计数变量用于:
当调用回调函数赋值时(输入),数组计数变量自动记录数据表中实际使用了的数组项,因此,在回调函数的输入部分,可用此变量循环操作vcbData中的数据,如上图。
当调用回调函数判断结果时(输出),数组计数变量的初始值为0,用户需要设置该变量的值,即在回调函数的输出部分,回调代码需要计算此变量的值,以便让VU了解实际的项数,如下图的输出代码,使用count_vcbData作为数组的项序号,同时计算了它的值,即链表中的实际项数。回调代码需保证数组计数变量的值不能大于等于数组的维数。
自定义复合类型作为过渡类型 如果过渡类型涉及到多个类型,可以使用自定义的复合类型来实现。下图中,要构造CMapStringToPtr中的数组,需要字符串类型的key,以及要保存到map中的对象指针,因此使用了复合类型。复合类型的定义与一般的类型定义类似,只是省略类型名称及最后的分号。复合类型定义后可以直接添加指针符号和/或数组。在回调函数的输入输出代码中,可以通过vcbData对复合类型中的各个成员进行访问及操作,如下图。
使用不定类型 如上图,过渡类型使用了void*,即任意指针,数据表中,可以通过类型重设将void*改为实际的类型,请参考类型重设。
使用文件 如果过渡变量是数据文件路径,则在回调赋值代码中,可以用下述API取得完整路径:
const char* VuxDataPathNameA(const
char* path); //ansi
const unsigned
short* VuxDataPathNameW(const
unsigned short*
path); //unicode 例如,目标类型的数据非常复杂,需要调用其他代码对某些文件进行解析才能构建,那么,可以将过渡类型设为const
char*,在数据表格中用“导入文件路径”功能设置过渡变量的值,回调函数用上述API取得完整路径,并构建目标类型的值。请参考针对单元格的数据文件。
|