如何制作一个无法打开的QIODevice

时间:2012-06-28 21:40:20

标签: qt unit-testing io

我正在尝试测试使用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的最佳方法是什么,我知道它无法打开?

1 个答案:

答案 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 }