Я разрабатываю тестовую структуру. Существует несколько наборов тестов, каждый из которых представляет собой класс с набором функций-членов для каждого отдельного теста.Список вызовов методов в производном классе
Я хотел бы найти способ динамической итерации всех тестов в классе.
Идеализированной установка может выглядеть примерно так:
class A : public Test
{
public:
A() {
addTest(a);
addTest(b);
addTest(c);
}
void a() { cout << "A::a" << endl; }
void b() { cout << "A::b" << endl; }
void c() { cout << "A::c" << endl; }
};
addTest() метод будет добавить свой параметр в списке; этот список повторяется в более поздней точке, и каждый метод запускается.
Есть ли способ достичь этого? Ближе мы придумали до сих пор это:
class Test
{
public:
template <typename T>
struct UnitTest
{
typedef void (T::*P)();
P f;
UnitTest(P p) : f(p) {}
};
// (this struct simplified: we also include a name and description)
virtual void run(int testId) = 0;
};
class A : public Test
{
public:
A() {
mTests.push_back(UnitTest<A>(&A::a));
mTests.push_back(UnitTest<A>(&A::b));
mTests.push_back(UnitTest<A>(&A::c));
}
void a() { cout << "a" << endl; }
void b() { cout << "b" << endl; }
void c() { cout << "c" << endl; }
// not ideal - this code has to be repeated in every test-suite
void run(int testId)
{
(this->*(mTests[testId].f))();
}
vector<UnitTest<A>> mTests;
};
Чтобы вызвать один тест за итерации основного выполнения цикла:
a->run(mTestId++);
Это не идеально, потому что каждый тест-люкс (класс) должен повторить код run() и иметь свой собственный член mTests.
Есть ли способ приблизиться к идеалу?
Итак ... почему бы просто не реализовать эту реализацию в базовом классе? –