Pregunta

Estoy usando MATLAB xUnit para probar algo de código. Me gustaría ser capaz de llamar directamente a algunas de las funciones que están contenidos en un directorio private.

He aquí una sencilla configuración replicable: Crear un directorio mismo proyecto con dos carpetas code y test. En code, cree un subdirectorio llamado private así le parece a los árboles de directorios

project_root
  code
    private
  test

En el lugar del directorio code una función

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

En el lugar private dir una función

function y = sub()
y = 123;
end

En el lugar test dir una función

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

Ahora vaya a la prueba y dir runtests llamada. Debería ver diciendo un error que sub no está definido.

directorios private no se permiten en el camino de MATLAB por lo que no es una opción. Lo que podía poner una función en el directorio code que recupera las manijas a todas las funciones privadas pero esto parece hacky.

¿Cuál es la mejor manera de conseguir el acceso para probar las funciones privadas?

EDIT:

La idea de navegar hasta el directorio privado tiene un problema. En la teoría de que podría llamar, por ejemplo.,

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

Por desgracia los navega marco de pruebas en el directorio que contiene las pruebas tan pronto como usted la llama run.

¿Fue útil?

Solución

Una solución es para navegar hasta el directorio privado de en testsub, consiga un función de mango para la función privada que desee mediante STR2FUNC , entonces navegar a hacer la prueba usando ese identificador de función. Usted podría incluso poner estos pasos en una función auxiliar separada para su unidad de pruebas, así:

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

Y usted podría utilizar esta función en testsub de la siguiente manera:

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

Estos trabajos, aunque el editor de MATLAB me da una M-Lint advertencia para el uso de la función CD : "MCC uso de la función CD es problemática ". Creo que es seguro para hacer caso omiso de esta advertencia ya que 1) el get_private_fcn función cambia el directorio actual, a continuación, cambia inmediatamente de nuevo después de recibir el identificador de función y 2) no está se trata de una aplicación desplegado.

Otros consejos

Si bien no se puede poner un directorio privado en su ruta de búsqueda, puede cd al propio directorio privado.

Una vez allí, MATLAB verá las funciones, y puede usarlos. Así es como yo que probar a mí mismo en funciones privadas.

El punto de directorios privados es tener funciones que tienen una visibilidad muy limitada, es decir, sólo para las funciones en code. Por lo tanto, no hay manera oficial (al menos que yo sepa) para hacerlos visibles.

La función que recuperar los mangos a lo que está en code/private me parece la manera más limpia de hacerlo.

La alternativa sería colocar en el interior testsub code. Esto tiene la ventaja de que las funciones de prueba son siempre junto con el código que se supone que prueba, pero puede sentir esta "contamina" el directorio de código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top