我是测试和 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/