У меня есть протестированные сервисы окон единицы, не тестируя сервис непосредственно, а скорее тестируя то, что делает сервис.
Обычно я создаю один блок для сервиса и другого для того, что делает сервис. Тогда я пишу модульные тесты против второго блока.
хорошая вещь об этом подходе состоит в том, что Ваш сервис является очень тонким. В основном все, что это делает, назвать методы, чтобы сделать правильную работу в нужное время. Ваш другой блок содержит всю суть работы, которую Ваш сервис намеревается сделать. Это делает очень легким протестировать и легкий к повторному использованию или изменить по мере необходимости.
Если вы используете GNU make
для сборки своего проекта, вы можете сделать что-то вроде этого:
%.o: %.cpp
$(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@
Это должно быть примерно самая ужасная вещь, которую я думал сделать в Makefile за долгое время. Я не думаю, что вы найдете быстрый или чистый способ сделать это в рамках компилятора, поэтому я бы поискал умные способы ввести информацию в процесс компиляции.
Удачи.
тогда вы могли бы сделать что-то вроде этого:%.o: %.cpp
$(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@
Это, должно быть, самое ужасное, что я думал сделать в Makefile за долгое время. Я не думаю, что вы найдете быстрый или чистый способ сделать это в рамках компилятора, поэтому я бы поискал умные способы ввести информацию в процесс компиляции.
Удачи.
тогда вы могли бы сделать что-то вроде этого:%.o: %.cpp
$(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o $@
Это, должно быть, самая ужасная вещь, которую я думал сделать в Makefile за долгое время. Я не думаю, что вы найдете быстрый или чистый способ сделать это в рамках компилятора, поэтому я бы поискал умные способы ввести информацию в процесс компиляции.
Удачи.
Для этого нет встроенного макроса, но, очевидно, вы можете написать свою собственную небольшую подпрограмму синтаксического анализа, которая берет файл и вырывает имя каталога для заданного полного исправленного имени файла. Позвольте вызвать эту функцию:
extern std::string parseLastDir (const char *path);
Затем вы можете создать такой макрос:
#define __DIR__ parseLastDir (__FILE__)
, который будет вести себя как то, что вы хотите (он дает вам std :: string вместо char *, так что очистка лучше определяется ) с соответствующей семантикой (его результаты зависят от файла, в котором он был вызван, поэтому он всегда получает правильный каталог.)
Depending on your compiler/how your software is built, you can declare a macro to be the current or any path when you compile.
gcc -D__DIR__=/usr/src/test/ test.c
I've never used the MS compiler but I know there is a similar option for ICC as well.
What you want is something similar to the unix
__BASE_FILE__
Take a look around http://theory.uwinnipeg.ca/localfiles/infofiles/gcc/cpp_13.html for it. I hope this helps.
EDIT: Attempt Two
How about using the #line preprocessor command. You can use it to change the filename variable too as you can see here: http://www.cppreference.com/wiki/preprocessor/line
Как насчет изменения вашей make-файла / системы сборки так, чтобы для ... / bar / file.cc
строка компиляции включала -D__DIR__ bar
. Так должно быть проще ...