c++ - 如何 stub /模拟 Qt 类?

标签 c++ unit-testing qt tdd mocking

我是测试和 TDD 的新手,但决定试一试并学习。目前我正在尝试开发一个类 SettingsManager 来处理我的应用程序的设置。它将存储应用程序的状态,当它关闭时,SettingsManager 将使用 QSettings 保存状态(并在启动时读取)。现在我想模拟 QSettings,这样我的测试就不会依赖于随机状态。但是,我找不到任何合理的模拟/ stub 方法,因为我需要的方法 (QSettings::value()) 不是虚拟的。

也许我在概念上做错了什么?或者有没有办法模拟那个非虚拟方法调用?

例子:假设我有这个类:

class SettingsManager
{    
private:
    /* app state variables */
    QSettings *settings;
    bool m_objectsVisible;

public:

    SettingsManager(QSettings *settings)
    {
       this->settings = settings;
    }

    void readSettings()
    {
       m_objectsVisible = settings.value("Settings/ObjectsVisible").toBool();
    }

    bool objectsVisible()
    {
       return m_objectsVisible;
    }
};

我想那样测试它(我使用 Hippomocks 语法只是为了提供一个想法)

void TestObjectsAreVisible() {
    MockRepository mocks;
    QSettings *settingsMock = mocks.ClassMock<QSettings>();
    mocks.ExpectCall(settingsMock , QSettings::value).With("Settings/ObjectsVisible").Return(true);
    SettingsManager *sManager = new SettingsManager(settingsMock);
    sManager->readSettings();
    assertTrue(sManager->objectsVisible);
}

最佳答案

我认为您正在对 QSettings 进行单元测试,但这不是单元测试的重点。

如果您想学习 TDD,请从更简单的东西开始。例如,尝试创建类的 MVP 三元组(模型和演示者应该有接口(interface),而 View 是 qt 类类型)。然后完全单元测试模型和演示者。 View 不应该有任何逻辑 - 只有 qt 调用。

像这样:

struct View : (some qt object )
{
  View( PresenterIface &p_ ) : p(p_) {}

  void buttonClicked()
  {
    p.buttonClicked();
  }

  PresenterIface p;
};

struct Presenter : PresenterIface
{
 Presenter( ModelIface &m_ ) : m(m){}
 void buttonClicked()
 {
  m.setValue();
 }

 ModelIface &m;
};

struct Model : ModelIface
{
  void setValue()
  {
    // do something
  }
};

关于c++ - 如何 stub /模拟 Qt 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5593595/

相关文章:

c# - FluentAssertions 排除重复配置

python - 菜单和 QtOpenGL.QGLWidget 之间的空间

c++ - 如何在 C++ 中定义扩展为条件语句的宏?

c# - Blazor 测试 InputDate 与 bUnit 的绑定(bind)

unit-testing - 当仅选择一个时,Resharper 运行所有测试

c++ - 无法在 C/C++ 代码中单击鼠标

c++ - 应用程序未在调试器中启动

c++ - 如何从 QDir 和相对文件路径创建绝对文件路径?

c++ - WriteFile() 可以用来将 wchar_t 字符写入文件吗?

C++ 如何从 Iterator(内部类)访问 Collection 成员变量 - 它有意义吗?