改变方法行为来测试它们是否正常?

问题描述 投票:0回答:1

我有课:

class MotorControl
{
    private:
        IAccelStepper *motor;
        IEncButton2<EB_ENCBTN> *encoder;
    
    public:
        void processEncoder();
        void returnToOrigin();
        void switchStep();
};

以及我想测试的方法:

void MotorControl::processEncoder()
{
    if (encoder->held())
        returnToOrigin();
    else if (encoder->click())
        switchStep();
}

在我的测试中,我想知道该方法(例如 returnToOrigin())是否被调用。我了解模拟,但我不需要模拟整个类,因此我无法编写接口并模拟它。 GoogleTest API 解释了如何模拟非虚拟方法,但它需要添加模板。另外,我有一个想法使这个函数非空(例如 int)并在每种情况下返回一些东西。

我很想知道仅为了测试而扩展(更改)类的行为是否是一种正常做法。也许我应该控制输出状态,而不是模拟其方法的一部分,但是如果某个方法使用很多参数,检查每个参数是否正常? 我将不胜感激任何帮助和建议。

c++ unit-testing googletest
1个回答
0
投票

我很想知道仅为了测试而扩展(更改)类的行为是否是正常做法

不,如果您的意思是您的方法在测试与正常操作时会有不同的行为、逻辑或实现不同的算法。

是的,如果您的意思是更改方法语法或 API,以便可以正确测试它。

例如,即使在您的应用程序中您只使用一种类型的电机并且仅使用一种类型,它不仅可以接受,而且建议创建一个电机接口(*),以便您可以模拟电机上的操作。这不会改变方法在测试环境和非测试环境中的工作方式,但它确实改变了它们的签名以在接口而不是具体类型上操作。

*)我在这里使用接口作为示例,但这实际上取决于测试框架,它可以是带有虚拟方法的接口,也可以是模板或测试框架需要的任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.