Domanda

MATLAB xUnit per testare un certo codice. Mi piacerebbe essere in grado di chiamare direttamente alcune funzioni che sono contenuti in una directory private.

Ecco un semplice configurazione replicabile: Crea una directory di progetto con due cartelle code e test. In code, creare una sottodirectory denominata private così voi albero delle directory assomiglia

project_root
  code
    private
  test

Al posto directory code una funzione

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

Nel luogo private dir una funzione

function y = sub()
y = 123;
end

Nel luogo test dir una funzione

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

Ora accedere alla directory di test e chiamata runtests. Si dovrebbe vedere un errore dicendo che sub è indefinito.

directory private non sono ammessi sul percorso MATLAB in modo che non è un'opzione. Potrei forse mettere una funzione nel dir code che recupera maniglie a tutte le funzioni private ma questo sembra hacky.

Qual è il modo migliore per ottenere l'accesso a testare le funzioni private?

EDIT:

L'idea di navigare alla directory privata ha un problema. In teoria potrei chiamare, per es.,

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

Purtroppo i naviga framework di test per la directory contenente i test non appena si chiama run.

È stato utile?

Soluzione

Una soluzione è quella di passare alla directory privato da nel testsub, ottenere un maniglia funzione alla funzione privata si desidera utilizzare STR2FUNC , torna quindi passare a fare il test utilizzando la funzione che la maniglia. Si potrebbe anche mettere questi passaggi in una funzione di supporto separato per il test di unità, in questo modo:

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

E si sarebbe utilizzare questa funzione in testsub come segue:

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

Questo funziona, anche se l'editor di MATLAB mi dà un M-Lint avvertimento per utilizzare la funzione CD : "l'uso MCC della funzione CD è problematico." Penso che sia sicuro per voi di ignorare questo avvertimento dal 1) la funzione get_private_fcn cambia la directory corrente, poi subito lo cambia di nuovo dopo aver ottenuto la maniglia funzioni e 2) che non sei si tratta di un'applicazione schierato.

Altri suggerimenti

Anche se non si può mettere un directory privata sul vostro percorso di ricerca, è possibile cd alla directory privata stessa.

Una volta lì, MATLAB vedrà le funzioni, e li può usare. Questo è come lo faccio io stesso test sulle funzioni private.

Il punto di directory private è quello di avere funzioni che sono molto visibilità limitata, vale a dire solo per le funzioni in code. Quindi, non v'è alcun modo ufficiale (almeno che io sappia) per renderli visibili.

La funzione che recuperare le maniglie per tutto ciò che è in code/private mi sembra il modo più pulito per andare su di esso.

L'alternativa sarebbe quella di inserire all'interno testsub code. Questo ha il vantaggio che le funzioni di test sono sempre insieme con il codice che si suppone di prova, ma si può sentire questo "inquina" la directory di codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top