c++ 如何测试不返回值的Arduino代码

igetnqfo  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(164)

这个问题可能不够明确。
我正在尝试使用VSCode和Platformio为Arduino程序编写测试。
下面是我要测试的函数的示例:

#include "flash.h"
#include <Arduino.h>

void flashXTimes(
    uint8_t LEDPin,
    uint16_t numberOfFlashes,
    uint16_t onDuration,
    uint16_t offDuration)
{
  for (uint16_t i = 0; i < numberOfFlashes; i++)
  {
    digitalWrite(LEDPin, HIGH);
    delay(onDuration);
    digitalWrite(LEDPin, LOW);
    delay(offDuration);
  }
}

我想检查一下当我用numberOfFlashes 3调用这个函数时,它实际上会 Flink 3次。当然代码很简单,不需要测试,但我还是想做测试。
所以ChatGPT给了我一个使用模拟数字写入的提示

static uint32_t digitalWriteCalls = 0;
void digitalWriteMock(uint8_t pin, uint8_t val) {
    digitalWriteCalls++;
}

但后来告诉我digitalWrite = &digitalWriteMock;,它在Python中可以很好地工作,但在C中不行。
通过使用Unity遵循Platformio测试指南,我进行了测试,但没有任何意义。
我希望在C
/Arduino测试入门方面得到一些帮助

r55awzrz

r55awzrz1#

根据ChatGPT的回答,您可能希望定义一个类型为“pointer to function“的变量,当您测试时,该变量指向test函数,当您运行“for真实的”时,该变量指向real函数。
例如:

void (*digitalWriteFunction)(uint8_t, uint8_t);
if (testing) {
    digitalWriteFunction = &digitalWriteMock;
}
else {
    digitalWriteFunction = &digitalWrite;
}

// From here on, use digitalWriteFunction pretty much the same way you'd call a function:
(*digitalWriteFunction)(LEDPin, HIGH);

显然,在mock函数中,你可以做任何你想做的事情,比如确认传递的参数值是什么,等等。

相关问题