Как проверить функции в личном каталоге? - PullRequest
8 голосов
/ 21 декабря 2010

Я использую MATLAB xUnit для проверки некоторого кода.Я хотел бы иметь возможность напрямую вызывать некоторые функции, которые содержатся в каталоге private.

Вот простая реплицируемая установка: создайте себе каталог проекта с двумя папками code и testcode создайте подкаталог с именем private, чтобы дерево каталогов выглядело как

project_root
  code
    private
  test

В каталоге code поместите функцию

function y = main()
y = sub();
end

В privatedir поместите функцию

function y = sub()
y = 123;
end

В test dir поместите функцию

function testsub()
assertElementsAlmostEqual(sub(), 123);
end

Теперь перейдите к тестовой директории и вызовите runtests.Вы должны увидеть сообщение о том, что sub не определено.

private Каталоги не разрешены в пути Matlab, поэтому это не вариант.Я мог бы поместить в каталог code функцию, которая извлекает дескрипторы для всех приватных функций, но это выглядит странно.

Каков наилучший способ получить доступ для проверки приватных функций?

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

Идея перехода в личный каталог имеет проблему.Теоретически я мог бы позвонить, например,

cd(privateDirectory);
suite = TestSuite.fromName(testDirectory);
suite.run

К сожалению, структура тестирования переходит в каталог, содержащий тесты, как только вы вызываете run.

Ответы [ 3 ]

7 голосов
/ 21 декабря 2010

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

function privateFcn = get_private_fcn(privateDir,fcnName)
  oldDir = cd(privateDir);         %# Change to the private directory
  privateFcn = str2func(fcnName);  %# Get a function handle
  cd(oldDir);                      %# Change back to the original directory
end

И вы бы использовали эту функцию в testsub следующим образом:

function testsub()
  privateDir = '...\project_root\code\private';    %# The path to the private
                                                   %#   directory
  privateFcn = get_private_fcn(privateDir,'sub');  %# Call get_private_fcn
  assertElementsAlmostEqual(privateFcn(), 123);    %# Apply your test
end

Это работает, хотя редактор MATLAB выдает мне M-Lint предупреждение за использование функции CD : «Использование MCC функции CD проблематично».Я думаю, что для вас безопасно игнорировать это предупреждение, поскольку 1) функция get_private_fcn изменяет текущий каталог, а затем сразу же меняет его обратно после получения дескриптора функции и 2) вы не имеете дело с развернутым приложением .

3 голосов
/ 21 декабря 2010

Хотя вы не можете поместить личный каталог в путь поиска, вы МОЖЕТЕ сделать cd в сам личный каталог.

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

1 голос
/ 21 декабря 2010

Суть частных каталогов состоит в том, чтобы иметь функции, которые имеют очень ограниченную видимость, то есть только функции в code. Таким образом, нет официального способа (по крайней мере, о котором я знаю) сделать их видимыми.

Функция, которая извлекает дескрипторы для всего, что находится в code/private, кажется мне самым чистым способом сделать это.

Альтернативой может быть размещение testsub внутри code. Это имеет то преимущество, что тестовые функции всегда вместе с кодом, который они должны тестировать, но вы можете почувствовать, что это «загрязняет» ваш каталог кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...