关于这个问题,我只在 C 中工作。
我有两个函数原型:
int pkg_permserver(const char *service, const char *protocol, int backlog, void (*errlog) (char *msg))
int pkg_permserver_ip(const char *ipOrHostname, const char *service, const char *protocol, int backlog, void (*errlog)(char *msg))
和以下代码段:
int test_permserv(char *port) {
    int return_val;
    int num_port;
    char *chr_port;
    int nr_test_passed=0;
    chr_port = (char *) bu_malloc(8 * sizeof( char), "port string");
    printf("TESTING  PKG_PERMSERVER.....\n PORT PARAMETER TEST: \n");
    printf("TESTING VALID PORT...\n");
    return_val = pkg_permserver(port ,"tcp", 0, 0);
    display(return_val,1,&nr_test_passed);
    printf("TESTING INVALID PORT...\n");
    num_port = -1;
    sprintf(chr_port, "%d", num_port);
    return_val = pkg_permserver(chr_port ,"tcp", 0, 0);
    display(return_val,0,&nr_test_passed);
}
我正在编写一个测试单元。我需要为函数的每个参数测试每种情况(有效/无效)。
我无法修改上述功能。pkg_permserver 和 pkg_permserver_ip 有完全相同的参数,除了 pkg_permserver_ip 有另外的 IpOrHostname。
如果我要编写另一个函数“test_permserver_ip”,我不想复制 - 粘贴来自 test_permserver 的部分(因为参数相同)。
我想到的是类似 int test_permserver(char * port, int which_function);
我想避免为 test_permserver_ip 复制相同的代码(对于与 test_permserver 相同的参数) pkg_permserver_ip 的测试函数尚未编写。
这是上述两个函数的代码:
int pkg_permserver(const char *service, const char *protocol, int backlog, void (*errlog) (char *msg))
{
    struct in_addr iface;
    iface.s_addr = INADDR_ANY;
    return _pkg_permserver_impl(iface, service, protocol, backlog, errlog);
}
int
pkg_permserver_ip(const char *ipOrHostname, const char *service, const char *protocol, int backlog, void (*errlog)(char *msg))
{
    struct hostent* host;
    struct in_addr iface;
    /* if ipOrHostname starts with a number, it's an IP */
    if (ipOrHostname) {
    if (ipOrHostname[0] >= '0' && ipOrHostname[0] <= '9') {
        iface.s_addr = inet_addr(ipOrHostname);
    } else {
        /* XXX gethostbyname is deprecated on Windows */
        host = gethostbyname(ipOrHostname);
        iface = *(struct in_addr*)host->h_addr;
    }
    return _pkg_permserver_impl(iface, service, protocol, backlog, errlog);
    } else {
    _pkg_perror(errlog, "pkg: ipOrHostname cannot be NULL");
    return -1;
    }
}