Google тестирует неопределенную ссылку, используя статическую переменную SetUpTestCase

Я пишу тестовый случай, который будет иметь SetUpTestCase() метод, который будет распределять общий ресурс, хотя я получаю неопределенные ошибки ссылочного компоновщика.

class ParsingEventsTest: public ::testing::Test {
protected:

static xml eventXml;

static void SetUpTestCase() {
ManagedObjectManagerSingleton::GET_SINGLETON().initializeTestEnvironment(PATH_TO_FILE);
eventXml= *ManagerSingleton::GET_SINGLETON().parse(PATH_TO_INPUT_FILES);
}

virtual void SetUp() {}
virtual void TearDown() {}
};

Это вызвало бы:

../test/ParsingEventsTest.o: In function `ParsingEventsTest::SetUpTestCase()':
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xa1): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xb0): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xbd): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xc2): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xce): undefined reference to `ParsingEventsTest::eventXml'
../test/ParsingEventsTest.o:ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xdd): more undefined references to `ParsingEventsTest::eventXml' follow
collect2: ld returned 1 exit status

РЕДАКТИРОВАТЬ:

Это также работает очень просто, например распределение int

class ParsingEventsTest: public ::testing::Test {
protected:

static int *x;

static void SetUpTestCase() {
x = new int [30];
}

static void TearDownTestCase() {
delete [] x;
}

virtual void SetUp() {}
virtual void TearDown() {}
};

4

Решение

Вы только объявили поле eventXml, Вы должны определить это где-нибудь. В каком-то файле .cpp вы должны поставить строку вроде

xml ParsingEventsTest::eventXml;

РЕДАКТИРОВАТЬ
Что касается причины, по которой это необходимо: объявление статического члена в классе не может его определить. Если это так, то каждая единица перевода, которая включает определение класса, будет определять его. Но каждой программе нужно одно определение, поэтому вам нужно выбрать место, где член определен вне определения класса (обычно в каком-то файле .cpp. Лучше всего определить с определением функций-членов). И синтаксис выглядит как выше.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]