2011-11-13 11 views
7

Estoy escribiendo pruebas EUnit para el código Erlang.EUnit no puede probar las funciones privadas

que tienen un módulo de fuente:

-module(prob_list). 
-export([intersection/2,union/2]). 

probability([], _Item) -> false; 
probability([{First,Probability}|Rest], Item) -> 
    if 
     First == Item -> Probability; 
     true   -> probability(Rest, Item) 
    end. 
... 
... 
... 

y un módulo de prueba de unidad:

-module(prob_list_tests). 
-include_lib("eunit/include/eunit.hrl"). 

-define(TEST_LIST,[{3,0.2},{4,0.6},{5,1.0},{6,0.5}]). 
-define(TEST_LIST1,[{2,0.9},{3,0.6},{6,0.1},{8,0.5}]). 
-define(TEST_UNO_LIST,[{2,0.5}]). 

probability_test() -> ?assertNot(prob_list:probability([],3)), 
         ?assertEqual(0.5,prob_list:probability(?TEST_UNO_LIST,2)), 
         ?assertNot(prob_list:probability(?TEST_UNO_LIST,3)), 
         ?assertEqual(0.2,prob_list:probability(?TEST_LIST,3)), 
         ?assertEqual(1.0,prob_list:probability(?TEST_LIST,5)), 
         ?assertNot(prob_list:probability(?TEST_LIST,7)). 
... 
... 
... 

Cuando corro eunit:test(prob_list,[verbose]) Dice:

prob_list_tests: probability_test...*failed* 
::undef 

pero cuando la exportación probability/2 en mi módulo prob_list, todo está bien.

¿Hay alguna manera de probar las funciones privadas?

Respuesta

3

Ok, así que aquí va:

dclements me dio un buen indicio de cómo puedo lograr lo que he pedido. No quiero poner todas mis pruebas en el módulo de origen, puede ver un buen ejemplo de cómo mantener la separación aquí: Erlang EUnit – introduction

Ahora mi solución es exportar todas las funciones en la compilación TEST. Por lo que poner:

-define(NOTEST, true). 

-export([intersection/2,union/2]). 
-ifdef(TEST). 
-export([intersection/2,union/2,contains/2,probability/2,lesslist/2]). 
-endif. 

Y luego compila con erlc -DTEST *.erl para ejecutar las pruebas, y la compilación ordinaria para exportar funciones sólo se necesitan.

+1

Ese es un enfoque razonable (aunque vale la pena señalar que puede tener varias líneas de exportación, lo que puede limpiar un poco las cosas), especialmente si desea separar las pruebas de su unidad en archivos separados y probar sus funciones privadas. El único inconveniente de este enfoque es que esto puede llevar a que el código pase la prueba, pero no se ejecutará de lo contrario si accidentalmente utiliza los métodos privados fuera de los archivos de prueba. –

+1

Para exponer todo al módulo de prueba, puede usar "-compile (export_all)". en lugar de mantener un gran estado de exportación. – goertzenator

8

El enfoque general que utilizo para esto es incluir todas las pruebas de unidad en el mismo archivo y la separará a cabo:

 
-ifdef(TEST). 
-include_lib("eunit/include/eunit.hrl"). 
-endif. 

%% Functions 
[...] 


-ifdef(TEST). 
%% Unit tests go here. 
-endif. 

Esto debería permitir poner a prueba sus funciones privadas al lado de su público funciones.

+0

que he hecho todo lo que he escrito, pero me da el mismo resultado. Ejecuto 'erlc -DTEST * .erl' para compilar y todavía obtengo :: undef de las funciones privadas. – Uko

+0

Ok, mi error, me olvidé de eliminar el nombre del módulo de la llamada de función dentro de las pruebas. – Uko

5

Usted puede usar la directiva -compile(export_all) exportar condicionalmente todas las funciones sólo when compiling for testing:

%% Export all functions for unit tests 
-ifdef(TEST). 
-compile(export_all). 
-endif. 
Cuestiones relacionadas