Издевательские члены класса C++ без внедрения зависимостей – возможно ли это?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Издевательские члены класса C++ без внедрения зависимостей – возможно ли это?

Сообщение Anonymous »

Приведенный ниже пример кода представляет собой упрощение гораздо более крупного проекта:

Код: Выделить всё

class IEaterOfCake
{
public:
virtual void EatCake() = 0;
};

class CakeMaker
{
public:
CakeMaker(IEaterOfCake & e) : mCakeEater(e) {}
void MakeCake() { mCakeEater.EatCake(); }
protected:
IEaterOfCake & mCakeEater;
};

class HungryMan : public IEaterOfCake
{
public:
HungryMan() : mCakeMaker(*this) {}
void HaveLunch() { mCakeMaker.MakeCake(); }
virtual void EatCake() override {/* mmmm cake */};
private:
CakeMaker mCakeMaker;
};

int main()
{
HungryMan m;
m.HaveLunch();
}
Я могу легко протестировать CakeMaker с помощью такого теста:

Код: Выделить всё

TEST(sometest)
{
class TestEater : public IEaterOfCake
{
virtual void EatCake() override {/* test cake is yummy */};
} t;
CakeMaker cm(t);
cm.MakeCake();
}
Теперь я хотел бы протестировать HungryMan с помощью макета CakeMaker. Слишком сложно тестировать HunrgyMan и CakeMaker как единое целое. На практике HungryMan имеет несколько внутренних классов, входящих в него аналогичным образом. Число возможностей растет в геометрической прогрессии!
Внедрение зависимостей в CakeMaker (или интерфейс к нему) было бы идеальным, но мы надеялись спрятать их внутри класса HungryMan. И я не уверен, как гарантировать, что ссылки на зависимости будут инициализированы при создании, поскольку эти зависимости также должны ссылаться на Hungry man. Обратите внимание, что в этом проекте нельзя использовать слово «new», динамическое размещение не разрешено.
Мне нужны предложения о том, как лучше структурировать этот проект, чтобы HungyMan можно было протестировать с помощью макета. /тестовая реализация. Сейчас я условно компилирую для mCakeMaker другой тип (MockCakeMaker). Но у меня все еще есть проблема, когда mCakeMaker является частным и недоступным для тестирования.
Надеюсь, я объяснил, хорошо, я немного потрудился!

Подробнее здесь: https://stackoverflow.com/questions/788 ... t-possible
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»