我正在尝试测试使用QIODevice
的类。实际上,该对象可能会使用QFile
,但对于我的单元测试,我更倾向于使用QBuffer
来获得速度。依赖注入和多态性结合起来得到我想要的东西。
Object::Object(QIODevice& source)
{
if(!source.open(QIODevice::ReadOnly))
{
qDebug("Object: Could not open source.");
}
}
然后在我的测试中我检查了消息:
void TestObject::printsErrorOnOpenFailure()
{
QTest::ignoreMessage(QtDebugMsg, "Object: Could not open source.");
QBuffer buffer;
Object obj(buffer);
}
不幸的是,即使没有QByteArray
操作,开放似乎仍然成功。给我的对象QIODevice
的最佳方法是什么,我知道它无法打开?
答案 0 :(得分:1)
您无法让QBuffer::open()
返回false (*)。因此,您无法在您的方案中使用QBuffer
。
但是,如果要进行子类化并只覆盖open()
总是返回false呢?
class UnopenableDevice : public QBuffer {
public:
bool open(QIODevice::OpenMode m) { return false; }
};
(*)至少不使用标记WriteOnly
和/或ReadOnly
。传递无效标志是唯一可能使其返回false的可能性。引用Qt 4.8.0来源:
corelib的/ IO / qbuffer.cpp:
332 bool QBuffer::open(OpenMode flags)
333 {
334 Q_D(QBuffer);
335
336 if ((flags & (Append | Truncate)) != 0)
337 flags |= WriteOnly;
338 if ((flags & (ReadOnly | WriteOnly)) == 0) {
339 qWarning("QBuffer::open: Buffer access not specified");
340 return false; // <----- only possibility to return false!
341 }
342
343 if ((flags & Truncate) == Truncate)
344 d->buf->resize(0);
345 d->ioIndex = (flags & Append) == Append ? d->buf->size() : 0;
346
347 return QIODevice::open(flags);
348 }
corelib的/ IO / qiodevice.cpp:
540 bool QIODevice::open(OpenMode mode)
541 {
542 Q_D(QIODevice);
543 d->openMode = mode;
544 d->pos = (mode & Append) ? size() : qint64(0);
545 d->buffer.clear();
546 d->accessMode = QIODevicePrivate::Unset;
547 d->firstRead = true;
548 #if defined QIODEVICE_DEBUG
549 printf("%p QIODevice::open(0x%x)\n", this, quint32(mode));
550 #endif
551 return true;
552 }