gpt4 book ai didi

CppUTest:如何将更多数据传递给特定的模拟调用?

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:07 25 4
gpt4 key购买 nike

我开始将 CppUTest 用于某些 C/C++ 项目。尤其是模拟扩展听起来不错,但我目前正在努力如何以正确的方式设置模拟。假设一个用于抽象网络套接字通信的低级类。

我的第一种方法:

size_t CMockSocket::recv(void* buf, size_t len){  return (size_t) mock().actualCall("recv")      .withParameter("len", (int) len)      .returnValue().getIntValue();}

设置期望:

mock().expectOneCall("recv")    .withParameter("len", 20)    .andReturnValue(15);

到目前为止一切顺利。但我需要的是提供更多数据——在本例中,我想通过 buf 指针返回 15 个字节。我尝试使用 .setData()setDataObject() 方法。但看起来函数将数据存储在命名变量中,而不是预期的函数调用。因此后续调用将覆盖前面的数据,对吧?

我当前的问题是如何将额外的返回 数据传递给模拟方法?我的第一个方法是创建一个包含返回值 (size_t) 和数据缓冲区的结果类。像这样:

class CRecvResults{public:  size_t m_returnValue;  void* m_buffer;  CRecvResults(size_t returnValue, void* buffer) :    m_returnValue(returnValue), m_buffer(buffer) {}  ~CRecvResults() {}};size_t CMockSocket::recv(void* buf, size_t len){  CRecvResults* pResults =      (CRecvResults*) mock().actualCall("recv")      .withParameter("len", (int) len)      .returnValue().getPointerValue());  assert(pResults != NULL);  assert(buf != NULL);  assert(len >= pResults->m_buffer.length());  memcpy(buf, pResults->m_buffer.data(), pResults->m_buffer.length());  return pResults->m_returnValue;}

和期望:

char* buffer = "some returning buffer content at least 15 chars long";CRecvResults results(15, buffer);mock().expectOneCall("recv")      .withParameter("len", 20)      .andReturnValue(&results);

问题:这是正确的方法还是我错过了什么?我需要缓冲区内容,因为我需要测试结果解释器。

我的第二种方法:

bool CMockSocket::send(const void* buf, size_t len){  return mock().actualCall("send")      .withParameter("len", (int) len)      .returnValue().getIntValue();}

设置期望:

mock().expectOneCall("send")    .withParameter("len", 20)    .andReturnValue(true);

在这种情况下,我想验证 buf 中由被测代码生成的传出数据。因此,我需要将该缓冲区内容(和长度)返回给测试函数。像这样:

class CSendResults{public:  bool m_returnValue;  char* m_buffer;  size_t m_length;  CSendResults(bool returnValue, char* buffer, size_t length) :    m_returnValue(returnValue), m_buffer(buffer), m_length(length) {}  ~CSendResults() {}};bool CMockSocket::send(const void* buf, size_t len){  CSendResults* pResults =      (CSendResults*) mock().actualCall("send")      .returnValue().getPointerValue();  assert(pResults != NULL);  assert(buf != NULL);  assert(pResults->m_length >= len);  memcpy(pResults->m_buffer, buf, len);  pResults->m_length = len;  return pResults->m_returnValue;}

和期望:

char buffer[1024];CSendResults results(true, buffer, sizeof(buffer);mock().expectOneCall("send")      .withParameter("len", 20)      .andReturnValue(&results);// further checks for results content...

这看起来非常难看,而且对我来说开销很大。我的问题又来了:这是正确的方法还是我错过了什么?

我的最后一个问题:我的测试方法会不会是完全错误的?请告诉我您的经验和做法!

最佳答案

CppUTest 中添加了一项新功能,可让您为模拟指定输出参数。它可能是这样的:

{
return (size_t) mock().actualCall("recv")
.withOutputParameter("buf", buf)
.withParameter("len", (int) len)
.returnUnsignedLongIntValueOrDefault(0);
}

期望可以这样指定:

char buffer[] = "blabla";

mock().expectOneCall("recv")
.withOutputParameterReturning("buf", buffer, sizeof(buffer))
.withParameter("len", sizeof(buffer))
.andReturnValue(sizeof(buffer));

buffer 的内容将通过输出参数复制到 mock 的调用者。因此不再需要丑陋的解决方法。

关于CppUTest:如何将更多数据传递给特定的模拟调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15243838/

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