TDD в C++. Как проверить функции друзей частного класса?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 TDD в C++. Как проверить функции друзей частного класса?

Сообщение Anonymous »

если у меня есть класс со вспомогательным классом (частным членом), вот так

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

    class Obj;
class Helper {
friend class Obj;
private:
int m_count;
Helper(){ m_count = 0;};  // Note this is a private constructor
void incrementCount(){
++m_count;
};
};
class Obj {
Helper *m_pHelper;
// note that this is a private getter
int getHelperCount() { return m_pHelper->m_count; };

// the public API starts here
public:
Obj() { m_pHelper = new Helper(); };
void incrementCount(){ m_pHelper->incrementCount(); };
};
Итак, как я могу TDD такую ​​систему?

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

    auto obj = new Obj();
obj->incrementCount();
// what to assert???
Это мой вопрос, а нижеследующее представляет собой лишь некоторую предысторию.
Ответ на некоторые ответы и комментарии.
< blockquote>
Если никто за пределами класса не должен быть заинтересован, то и ваши тесты не должны быть заинтересованы. – Арне Мерц
Если никого не интересуют ценности вне класса, почему вы – утнапистим

Даже если никому извне это значение не нужно, я все равно хочу знать, правильно ли оно установлено, поскольку оно используется другим автономным внутренним методом класса, который использует это значение. Возможно, значение — это скорость, с которой контроллер будет использовать ее для обновления модели. Или, может быть, это позиция, в которой представление будет использовать ее для рисования чего-либо на экране. И фактически все остальные компоненты Obj смогут получить доступ к этой переменной. Возможно, это проблема с дизайном, и в этом случае я хотел бы знать, какие альтернативы у меня могут быть получше. Дизайн указан в разделе «Справочная информация» внизу этого сообщения.

определите частное общедоступное – Марсон Мао

Люблю это гениальное злоупотребление ключевыми словами, ха-ха. Но пока это не лучшее решение.

Вам нужно «раскрыть» дружеские отношения в заголовке вашего класса. Таким образом, вы должны признать существование класса, используемого для тестирования вашего.
Если вы используете идиому pImpl, вы можете сделать все члены самого pImpl общедоступными, а сам pImpl — закрытым и предоставить вашим модульным тестам доступ к pImpl - CashCow

Означает ли это, что мне следует добавить тест в мой исходный класс? Или добавить к нему дополнительные «тестовые» методы?
Я совсем недавно начал TDD. Часто ли (или, лучше, хорошо) вторгаться в исходный класс с зависимостью тестового класса? Я не думаю, что у меня есть необходимые знания, чтобы судить. Есть какие-нибудь советы по этому поводу?
Разное: AFAIK TDD — это не просто написание тестов, а процесс разработки. Я читал, что мне следует писать тесты только для публичного интерфейса. Но проблема в том, что, как и в рассматриваемой ситуации, большинство кодов и т. д. содержатся в частном классе. Как я могу использовать TDD для создания этих кодов?
Справочная информация
К вашему сведению, если вы хотите знать, почему я создаю частный класс:
Я разрабатываю игру для cocos2dx. Игровой движок использует древовидную структуру Node для обновлений, рендеринга и т. д., и каждый игровой объект будет наследоваться от класса Node, предоставленного в движке. Теперь я хочу реализовать шаблон MVC в игровом объекте. Итак, для каждого объекта я создал класс Object с тремя вспомогательными классами, соответствующими каждому из компонентов MVC, с именами ObjectModel, ObjectView, ObjectController. Теоретически никто не должен обращаться к классам MVC напрямую, и доступ к ним будет возможен только через класс Object, поэтому я делаю три из них частными. Причина создания компонентов MVC явно как классов заключается в том, что представление и контроллер обновляются с разной скоростью (точнее, контроллер выполняет обновления, зависящие от кадра, а представление выполняет простую интерполяцию на основе данных модели). Класс Model создан исключительно по религиозным соображениям, лол.
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/252 ... vate-class
Ответить

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

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

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

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

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