C ++ Поддельный класс с обратными вызовами - PullRequest
1 голос
/ 05 января 2011

Каким будет хороший шаблон проектирования, если мне потребуется протестировать класс C ++ A, который взаимодействует с классом B, где вызовы B инициируют обратные вызовы A позже?
Мне требуется полный контроль над этими обратными вызовами - когда они выполняютсяи с какой информацией.

Я использую Google Test и Google Mock в качестве основы тестирования.В введении Google Mock они объясняют разницу между и фальшивкой .Кажется, мне нужен поддельный класс B, а не фиктивный.
В своих документах они подробно описывают, как иметь нетривиальные реализации функций B , но это не решает моего требования по управлению обратными вызовами из Bдо A.

ОБНОВЛЕНИЯ:

  • Просто чтобы уточнить: A имеет обратные вызовы.Через некоторое время после того, как A вызывает функции B, B инициирует функции обратного вызова в A. Хотя не имеет значения, как именно, в моем случае B держит указатель на A и вызывает предопределенную интерфейсную функцию (производную от чисто виртуального класса A_abstract).

Ответы [ 3 ]

2 голосов
/ 05 января 2011

class A не должно беспокоить, если вызовы обратного вызова выполняются с помощью B или каким-либо совершенно другим кодом, если вся информация, предоставленная в обратном вызове, верна.

Это означает, что, если ваш тестовый сценарий может получить всю информацию, необходимую для обратного вызова, вы можете вызвать обратный вызов из тестового сценария в соответствующее время и использовать макет для class B.


Если class A фактически проверяет, что обратные вызовы выполняются class B (насколько это реально может быть достигнуто), то классы A и B слишком тесно связаны, чтобы проверить их по отдельности. Тогда вам следует переосмыслить, действительно ли они должны быть двумя тесно связанными классами.

0 голосов
/ 05 января 2011

Рассматривали ли вы использование сигналов и слотов Qt (или кого-то еще)? Мне нравится рассуждать о сигналах и слотах гораздо больше, чем о обратных вызовах, хотя (я думаю) они в основном эквивалентны по функциональности.

-Brian-

0 голосов
/ 05 января 2011

Я не знаю, правильно ли я понял ваш вопрос, но, похоже, вы желаете шаблон стратегии .Вы можете выполнять обратные вызовы от B до A, если у вас есть указатель A_abstract в качестве переменной-члена в B.

class A_abstract {

public:
    virtual void work() = 0;
};

class B {

private:
    A_abstract* _m_A_ptr;

public:
    set_a_ptr(A_abstract* _APtr) { _m_A_ptr = _APtr; }

    void work() {  _m_A_ptr->work(); }
};
...