2013-04-29 2 views
2

Я реализую тестовый класс для моего проекта в QT. Я добавил тесты для всех публичных функций, однако есть несколько частных функций, которые id хотел бы включить в мое тестирование.Можно ли вызвать частные функции из тестового класса QT

Очевидно, что это не будет работать, потому что они являются частными функциями-членами, но я задавался вопросом, можно ли это обойти на основе, я хочу получить к ним доступ из тестового примера, я особенно не хочу менять свой код, чтобы мои тесты работа, потому что это не очень полезно, id, как функции, чтобы быть закрытыми, но я также хочу иметь возможность их протестировать.

Просто интересно, есть ли у кого-нибудь идеи о том, возможно ли это, или мне нужно изменить свои функции на защищенные или что-то еще, а затем наследовать класс для моего теста?

ответ

2

Общепринятой практикой является проверка только публичных функций, но вы можете сделать тестовый класс как друга исходного класса. Что-то вроде этого:

Отклонение друга должно находиться внутри флага #define UNIT_TEST.

#include <iostream> 

class ToTestClass 
{ 
#ifdef UNIT_TEST 
    // ToTestClass declares TesterClass as a friend. 
    friend class TesterClass; 
#endif 

private: 
    void privateMethod() 
    { 
     std::cout << "hey there" << std::endl; 
    } 
}; 

class TesterClass 
{ 
public: 
    TesterClass() 
    { 
     ToTestClass totest; 
     // TesterClass now has access to ToTestClass's private members and methods. 
     totest.privateMethod(); 
    } 
}; 

int main() 
{ 
    TesterClass tester; 
    return 0; 
} 
+0

извините, я не понимаю бит #define, вы можете обновить свой код, потому что на данный момент у меня много ошибок для размещения друга как класса, и должен ли он быть 'friend class testerClass' – AngryDuck

+0

Я только что обновил, можете ли вы протестировать еще раз? –

+0

Cheers thats отлично работает сейчас ^^ – AngryDuck

1

Вариант один. Ваши функции могут быть условно государственным и частным

#ifdef UNIT_TEST 
#define ut public 
#else 
#define ut private 

class Testee 
{ 
    public: 
    .... 


    ut: 
    //private functions to be tested 


    ptivate: 
}; 

Затем в вашем заголовке тест, просто

#define UNIT_TEST 
#include <Testee.h> 

Это немного опасно, если испытания и применение находятся в одном проекте (программе), так как по к стандарту определения классов должны быть одинаковыми во всех единицах перевода в одной и той же программе, иначе неопределенное поведение.

Во-вторых, проще и безопаснее указать класс тестера в качестве друга.

class Testee 
{ 
    public: 
    .... 

    ptivate: 
    .... 
    friend class Tester; 
}; 
+0

Еще одна проблема, которую вы можете упомянуть, заключается в том, что замена этих модификаторов доступа имеет хорошие шансы изменить макет памяти класса. В конце концов, стандарт гарантирует, что члены, использующие один и тот же модификатор доступа, встречаются в памяти в том же относительном порядке, который они объявляют. – Agentlien

+0

Так что в моем классе, который содержит мои личные функции, которые я хочу проверить, как частный член, я добавляю «тест класса друга», потому что я просто попробовал это, и он все еще говорит, что не может получить доступ к переменной частного члена – AngryDuck

+0

@AngryDuck: Это не имеет значения где вы добавляете 'friend class TesterClass;' - публичную или частную зону. После того, как вы добавите его, все функции TesterClass будут доступны для частных членов Testee. –