1

是否有任何“好”方法可以使等待 recvfrom() 调用的线程解锁并返回错误?

这样做的动机是为包含读取 UDP 数据报的单元的系统编写单元测试。其中一个分支处理 recvfrom 调用本身的错误。代码不需要区分不同类型的错误,它只需要设置一个标志。

我曾想过从另一个线程关闭套接字,或者关闭它,以导致 recvfrom 返回错误,但这似乎有点笨拙。我在其他地方看到过发送一个过大的数据包可以做到这一点,因此设置了一个实验,将一个 16K 的缓冲区发送到一个等待 4K 的 recv,但这并没有导致错误。recvfrom 只返回 4096,表示它已经获得了那么多字节。

4

5 回答 5

2

如果您正在测试的类与您的应用程序的其余部分很好地隔离,也许您可#include​​以从您的单元测试批发.c 源文件。#define recvfrom(...)然后,您可以仅在测试中使用宏来访问您自己的私有函数。

请注意,这会将您的私有实现暴露给单元测试;您仍然应该针对公共界面进行测试并假装您看不到胆量。它非常 hacky,但它至少包含了你的单元测试的所有丑陋之处,而不会破坏可交付的代码。

于 2010-05-23T04:52:23.670 回答
1

您可以围绕网络库创建一个类,但有时会根据某些标准使其失败。例如,您可以根据特定的网络性能级别让此网络层失败,您可以在特定频率下模拟错误。

我过去曾问过类似的问题,这也可能有所帮助。

于 2010-05-22T02:29:52.223 回答
0

我从来没有在 C 中这样做过,但是在 C#/Java 中,我围绕 Sockets、TCPClient 等创建了包装类。每个包装类都实现了我创建的一个接口,该接口代表我有兴趣使用的方法。这允许我使用依赖注入模式来注入模拟或存根套接字。也许这种模式会有所帮助,尽管您必须翻译成您的语言。

于 2010-05-22T09:40:45.983 回答
0

我认为可能需要采取一种有点笨拙或棘手的方法。

您是否尝试过使用ioctl(sock, FIONBIO,将套接字切换到非阻塞模式?

于 2010-05-22T02:48:42.653 回答
0

最简单的可能是发送信号,但这取决于原始代码是否设置了处理程序。

于 2010-05-22T02:51:57.537 回答