2

を使用するクラスをテストしようとしてい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残念ながら、openは、操作しなくても成功するようです。QIODeviceオブジェクトを開くことができないことがわかっているオブジェクトを与えるための最良の方法は何ですか?

4

1 に答える 1

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 }
于 2012-06-28T22:07:26.927 に答える