Я пишу короткую программу, подобную тесту, как часть более крупного проекта. Я написал несколько простых функций в файле «Utilities.hpp», для которого я пишу тесты. Вот код ... некоторые определения функций были исключены по длине.Функции, не признанные как часть пространства имен
//Main.cpp
#ifdef RUN_TESTS
#include "Logger.hpp"
#include "UnitTester.hpp"
#define TEST_ALL
int main(int, char*[])
{
logger::init();
logger::setSeverityLevel(INFO);
auto slg = logger::getSLogger();
BOOST_LOG_SEV(slg, INFO) << "Starting Unit Tests...";
testing::UnitTester testObject;
testObject.runTests();
}
#endif
Utilities.hpp
#pragma once
#include <string>
#include <stack>
#include <vector>
namespace util
{
void swapChars(char& a, char& b); //flips two chars
std::string reverseString(const std::string& str); //stack based implementation of string inversion
std::vector<std::string> splitStrAtSubstr(const std::string& str, const std::string& split); //splits string into parts seperated by "split"
}
Utilities.cpp
#include "Utilities.hpp"
void util::swapChars(char& a, char& b)
{
...
}
std::string util::reverseString(const std::string& str)
{
...
}
std::vector<std::string> util::splitStrAtSubstr(const std::string& str, const std::string& split)
{
...
}
Наконец класс UnitTester ... UnitTester.hpp
#pragma once
#define RUN_TESTS
#define RUN_ALL
#ifdef RUN_TESTS
#include "Logger.hpp"
#include <string>
#include <vector>
namespace testing
{
class UnitTester
{
public:
UnitTester();
~UnitTester();
void runTests();
private:
src::severity_logger<severity_level> testLogger;
void utilities();
void logging();
void resourceGroup();
void resourceManager();
void INIParser();
};
}
#endif
UnitTester.cpp
#include "UnitTester.hpp"
#ifdef RUN_TESTS
void testing::UnitTester::runTests()
{
#ifdef RUN_ALL
utilities();
logging();
resourceGroup();
resourceManager();
INIParser();
#elif
#ifdef TEST_UTILITIES
utilities();
#endif
#ifdef TEST_LOGGING
logging();
#endif
#ifdef TEST_RESOURCE_GROUP
resourceGroup();
#endif
#ifdef TEST_RESOURCE_MANAGER
resourceMananager();
#endif
#ifdef TEST_INI_PARSER
INIParser();
#endif
#endif
}
//PRIVATE FUNCTIONS
void testing::UnitTester::utilities()
{
#include "Utilities.hpp"
BOOST_LOG_SEV(testLogger, INFO) << "Now testing: void util::swapChars(char& a, char& b);";
char a = 'a', b = 'b';
util::swapChars(a, b);
if (a != 'b' || b != 'a') { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::swapChars failed."; }
BOOST_LOG_SEV(testLogger, INFO) << "Now testing: std::string util::reverseString(const std::string& str);";
if (util::reverseString("myString") != "gnirtSym") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"myString\""; }
if (util::reverseString("MYSTRING ") != " GNIRTSYM") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"MYSTRING \""; }
if (util::reverseString("aaaaaa") != "aaaaaa") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"aaaaaa\""; }
if (util::reverseString("This Is An Extended TEST") != "TSET dednetxE nA sI sihT") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"This Is An Extended Test\""; }
if (util::reverseString("\"\\\"Escape") != "epacsE\"\\\"") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"\"\\\"Escape\""; }
BOOST_LOG_SEV(testLogger, INFO) << "Now testing: std::vector<std::string> splitStrAtSubstr(const std::string& str, const std::string& split)";
std::vector<std::string> expected("One", "Two", "Three");
std::vector<std::string> expected2("One", "Three");
if (util::splitStrAtSubstr("One.Two.Three", ".") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One.Two.Three\", \".\""; }
if (util::splitStrAtSubstr("One\"Two\"Three", "\"") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One\"Two\"Three\", \"\"\""; }
if (util::splitStrAtSubstr("OneTwoThree", ".") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One.Two.Three\", \".\""; }
if (util::splitStrAtSubstr("OneTwoThree", "Two") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"OneTwoThree\", \"Two\""; }
}
void testing::UnitTester::logging()
{
#include "Logger.hpp"
}
void testing::UnitTester::resourceGroup()
{
#include "ResourceManager\ResourceGroup.hpp"
}
void testing::UnitTester::resourceManager()
{
#include "ResourceManager\ResourceGroup.hpp"
}
void testing::UnitTester::INIParser()
{
#include "INIParser.hpp"
}
#endif
Вот что я считаю репрезентативной выборкой различных ошибок, которые я получаю. Я поставлю те, которые, как я думаю, больше всего подозревают на самом верху. Как часто они делают, многие ошибки просто вызваны из-за остальных ...
В объявлении функции в Utilities.hpp:
Ошибка 14 Ошибка C2039: «Вектор»: не является членом " std '
Ошибка 13 ошибка C2143: синтаксическая ошибка: отсутствует', 'до' & '
Ошибка 15 ошибка C2143: синтаксическая ошибка: отсутствует'; ' перед '<'
Ошибки 10 ошибки C2039: 'строки': не является член 'Std'
На BOOST_LOG_SEV вызывает в UnitTester.hpp:
Ошибки 69 Ошибка C2597: незаконная ссылка на нестатический Member 'testing :: UnitTester :: testLogger'
Ошибка 49 ошибка C2228: слева от '.stream' должен быть класс/структура/объединение Ошибка 63 ошибка C2228: слева от '.open_record' должен быть класс/структура/объединение
О вызовах функций в UnitTester.cpp:
Ошибка 51 Ошибка C2039: 'splitStrAtSubstr': не является членом 'Util'
Ошибка 31 ошибки C2664: 'INT Util :: reverseString (Const целое)': не может преобразовать аргумент 1 от «сопзЬ полукокса [10 ] 'to' const int ' ^^ происходит потому, что компилятор не может найти std :: string как тип, а по умолчанию - int
Это самая важная ошибка, которая кажется. Для меня проблема почти наверняка встречается в Utilities.hpp, где компилятор, похоже, не распознает std :: string и std :: vector и придумывает какую-то странную интерпретацию объявлений функций.
Заранее спасибо.
Вы получаете сообщение об ошибке «vector» не указано в файле заголовка, где вы сначала делаете '#include'? Ты уверен? Похоже, что вы что-то не можете нам каким-то образом показать. Во-первых, вы никогда не '#include ' в любом месте, кроме как в 'Utilities.cpp', что не имеет смысла. –