Def*_*ult 6 c sockets testing networking mocking
我有一个使用套接字的功能,我会嘲笑它,但我找不到怎么做.
有没有办法在C中模拟套接字?
谢谢
大多数系统/库函数都是弱符号.这意味着您可以创建自己的实现,以覆盖现有版本.然后,您可以在单元测试时使用这些功能.
假设您要测试以下函数:
src.c:
int get_socket()
{
int s;
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == -1) {
perror("socket failed");
} else {
printf("socket success\n");
close(s);
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
然后,您将在单独的源文件中创建模拟函数(以及任何控制变量):
mock_socket.c:
int sock_rval;
int socket(int domain, int type, int protocol)
{
printf("calling mock socket\n");
return sock_rval;
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个文件中进行测试:
test_socket.c:
extern int sock_rval;
int get_socket();
int main()
{
sock_rval = -1;
int rval = get_socket();
assert(rval == -1);
sock_rval = 3;
int rval = get_socket();
assert(rval == 3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后,您将编译这三个模块并将它们链接在一起.然后get_socket
将调用socket
mock_socket.c中的函数而不是库函数.
这种技术不仅适用于套接字函数,而且适用于一般的系统/库函数.