gpt4 book ai didi

c++ - 设计调用外部API的类时测试实现是否正确?

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:57 24 4
gpt4 key购买 nike

我从一些遵循这些原则的原型(prototype)代码开始:

// Omitted most definitions, return values checks, etc.
// The real code is much bigger and uglier.
serverId = socket(AD_INET, SOCK_STREAM, PROTO_ANY);
setsockopt(serverId, SOL_SOCKET, SO_REUSEADDR, &reuseAddrOk, sizeof(int));
bind(serverId, &serverAddress, sizeof(serverAddress));
listen(serverId, waitQueueSize);
clientId = accept(serverId, &clientAddress, sizeof(clientAddress));
read(clientId, clientBuffer, charsToRead);

现在我想在非常简单的类中重构此代码提取功能(暂时不尝试使事情变得非常通用......YAGNI)。这是我正在考虑的那种界面:

SocketServer server = SocketServer(parameters);
// SocketServer knows how to create a SocketClient...abstract factories, dependency injection, etc. etc.
SocketClient client = server.accept();
string clientMessage = client.read();
client.write(serverMessage);

例如,SocketServer 类封装了用于创建新套接字服务器的所有样板文件:

SocketServer server = SocketServer(parameters);

然后,因为这需要调用系统 API,所以我需要模拟它:

SocketServer server = SocketServer(systemAPI, parameters);

现在,测试此代码是否正确意味着什么?它不会产生任何我可以检查的输出(或者更好的是,我所做的所有这些都是为了封装输出,比如文件描述符)。我可以检查是否调用了模拟 API 的正确方法,例如:

testSocketCalledWithCorrectParameters() {
systemAPI = mock(SystemAPI).expect(once()).method("socket").with(
SystemAPI.AF_INET,
SystemAPI.SOCK_STREAM,
SystemAPI.PROTO_AUTO
);
ServerSocket(systemAPI, parameters);
}

在这种情况下,我应该依赖于测试实现而不是接口(interface)吗?是否被迫测试一个实现而不是一个糟糕设计的界面?

我能想到的所有其他测试都设定了对实现的期望:

testServerSocketIsCreatedWithCorrectDescriptor() {
dummyDescriptor = 10;
systemAPI = mock(SystemAPI).when("socket").return(dummyDescriptor);
server = SocketServer(systemAPI, parameters);
assertEquals(dummyDescriptor, server.descriptor);
}

/**
* @expected SocketException
*/
testThrowsExceptionIfErrorCreatingSocket() {
systemAPI = mock(SystemAPI).when("socket").return(SystemAPI.RETURN_ERROR);
SocketServer(systemAPI, parameters);
}

// etc.

然后,我是否应该也为 socketAPI 编写单元测试,或者我是否应该理所当然地认为它将是一个非常愚蠢的包装类,除了将调用委托(delegate)给外部 API 之外什么都不做(因此不需要测试)?

最佳答案

让我试着一一回答。

<强>1。测试调用属性

这种测试只有文档值(value)(这是调用 API 的方式。)检查,如果它真的值得 -> 也许你的代码中的语句足够清楚。

<强>2。 testServerSocketIsCreatedWithCorrectDescriptor:

对我来说,这种测试更有值(value)。我几乎总是写一个 testCreation 来显示:输入参数和断言属性,例如一辆汽车需要轮子来 build ,默认情况下有 4 个轮子,红色和一个方向盘。

<强>3。 testThrowsExceptionIfErrorCreatingSocket

这种测试是最有值(value)的。他们定义和保护你的类(class)在不同情况下的行为。我在这里遗漏了一个断言,例如抛出的异常类型。尽可能多地编写此类测试。

<强>4。测试系统API

没有。永远不要在单元测试中测试系统行为。特别是没有模拟。这是模块或端到端测试的一部分。

希望这对您有所帮助。

关于c++ - 设计调用外部API的类时测试实现是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com