2016-02-11 1 views
2

Я новичок в тестировании google и относительно новичок в C++ в целом. Рассматривая следующий упрощенный пример, что может быть хорошим общим подходом к тестированию CDeviceCreator? Мне обязательно нужен макет. Я читал о насмешливости в тесте Google, но с трудом понимаю это. Можете ли вы привести пример, характерный для этого случая. Заранее спасибо.Нужен хороший подход к тестированию фабричного класса в тесте Google

Это интерфейс для фабрики класса

class IDeviceCreator 
{ 
public: 
    IDeviceCreator(){ 
    }; 
    virtual ~IDeviceCreator(){ 
    }; 
    virtual IDevice * CreateAnalogDevice() = 0 ; 
    virtual IDevice * CreateDigitalDevice() = 0 ; 
}; 

Учитывая, что: CAnalogDevice и CDigitalDevice осуществляют чтения компакт-дисков

Это бетона класса фабрики

class CDeviceCreator : public IDeviceCreator 
{ 
public: 
    IDeviceCreator(){ 
    } 
    virtual ~IDeviceCreator(){ 
    } 
    virtual IDevice * CreateAnalogDevice(){ 
     IDevice * anlogDev; 
     anlogDev = new CAnalogDevice(); 
     return anlogDev; 
    } 
    virtual IDevice * CreateDigitalDevice(){ 
     IDevice * digDev; 
     digDev = new CDigitalDevice(); 
     return digDev; 
    } 
}; 

ответ

3

Ваш метод CDeviceCreator :: CreateAnalogDevice вызывает конструктор CAnalogDevice. Скорее всего, реальный конструктор на самом деле не должен вызываться во время ваших модульных тестов: вероятно, его использование вызовет «раздражения», например: a) введение аппаратных зависимостей и, таким образом, невозможность запуска модульных тестов в среде разработки, а не в целевой система, b) увеличение времени сборки, если соответствующий код является большим или, опять же, связывает много другого кода, c) возможно, библиотека еще не завершена или находится в состоянии багги, d) ...

Для этого разум, вы хотели бы изолировать свой код от этого реального конструктора и вместо этого использовать замену. У вас есть несколько возможностей для обеспечения изоляции:

  • Использование (грязных) препроцессорных трюков, таких как #defining CAnalogDevice для чего-то еще в модульном тесте.
  • Ссылка на вашу конкретную реализацию CAnalogDevice. Эта реализация может быть макетной, но в этом простом примере, скорее всего, что-то более простое (например, заглушка) могло бы сделать то же самое.

Подведено: Вам необязательно использовать макет, но, скорее всего, вам придется что-то сделать для достижения изоляции. И, конечно, все это так же справедливо для CDigitalDevice.

Есть некоторые дополнительные рекомендации вы могли бы найти ценное:

  • Вы должны сделать это привычкой, чтобы инициализировать значения в точке определения. То есть, вместо того, чтобы писать

    IDevice * digDev; 
    digDev = new CDigitalDevice(); 
    

    предпочитают

    IDevice * digDev = new CDigitalDevice(); 
    
  • Некоторые люди (включая меня), как использовать сопзЬ просто везде. Например, после ввода изменения инициализации, как показано выше:

    IDevice * const digDev = new CDigitalDevice(); 
    
+0

Спасибо за ваши отзывы. Вы правы, что использование реальных конструкторов создает аппаратные зависимости. По крайней мере, для моего конкретного случая. – MIbrah