2012-06-28 3 views
2

Я пытаюсь протестировать класс, который использует QIODevice. На самом деле объект, вероятно, будет использовать QFile, но для моего модульного теста я бы предпочел использовать QBuffer для скорости. Инъекция зависимости и полиморфизм объединяются, чтобы получить то, что я хочу.Как сделать неприменимый QIODevice

У меня есть проблема, однако. Мой конструктор класса выглядит следующим образом:

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

Зачем вам нужен указатель к вашему 'QIODevice'? – leemes

+0

Потому что я не думал об этом достаточно тщательно, когда упростил код установки для примера. Я удалю это, так как это не важно. – cgmb

+0

Хорошо. Я просто задавался вопросом ...;) – leemes

ответ

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/И.О./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/И.О./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 } 
+0

Это невозможно создать. QIODevice :: readData и QIODevice :: writeData являются чисто виртуальными. Я заменил наследование от QIODevice наследованием от QBuffer и удалил ненужный конструктор. – cgmb

+0

О да, спасибо за это. Я исправляю свой ответ. – leemes

+1

Другой возможностью было бы использовать 'QFile (" ")'; это тоже нельзя открывать. – leemes

Смежные вопросы