risposta

4

Questa è una buona domanda. Per essere più precisi sul problema:

Higher-order functions "prendere o produrre altre funzioni come argomenti o risultati". Quindi ci sono due casi:

  1. funzioni che svolgono funzioni. Esempi: map, reduce, filter. Questi non sono troppo difficili da testare; basta fornire tutti i parametri come si farebbe per una normale funzione.

  2. funzioni che restituiscono funzioni. Esempi: (fn [x] (fn [y] (+ x y))), (partial filter #(> % 1)). Questi sono difficili da testare perché non possiamo confrontare direttamente l'uguaglianza di funzioni (cercare l'uguaglianza intensionale ed estensionale per una discussione approfondita).

    Dovrebbe essere ovvio che semplicemente non testare non è una strategia molto buona. Quindi, perché non utilizzare la vista Haskell, le funzioni parzialmente applicate sono essenzialmente le stesse funzioni che restituiscono funzioni: in altre parole, passa abbastanza parametri alla funzione restituita per ottenere un risultato che è possibile verificare per l'uguaglianza.

    Basta fare attenzione a fare attenzione all'accoppiamento nei test: accertarsi che i test case stiano effettivamente testando le specifiche della funzione di ordine superiore, non solo la funzione che restituisce.

+0

su quella nota, sono state testate anche le macro specialmente quelle doXYZ? –

2

Le funzioni di ordine superiore restituiscono ancora risultati, quindi è ancora possibile controllarlo.

Ad esempio, se si desidera testare map, pensare a cosa deve fare: Si suppone che ottenga una funzione e una raccolta come argomenti, applicare detta funzione a ogni elemento della raccolta, restituendo una nuova raccolta di i risultati.

Quindi un modo semplice di test che sarebbe:

(is (= [1 2 3 4] (map inc [0 1 2 3])) 

Lo stesso principio si applica se si sta testando una funzione di ordine superiore che è il risultato di un'altra funzione: è sufficiente testarlo restituisce quello che si suppone a, dopo aver chiamato la funzione che lo restituisce:

(defn adder [n] 
    (fn [x] 
    (+ x n))) 

(is (= ((adder 10) 5) 15)) 

Spero che questo aiuti.

+0

Questo ha davvero senso. Grazie, penso che non stavo trattando la funzione come valori e pensando qualcos'altro. Fintantoché non esiste alcuna mutazione, se una funzione di ordine superiore restituisce un valore coerente per una lamda e una lista, dovrebbe essere coerente con qualsiasi funzione lambda che viene passata. Grazie mille! –

+0

ma per quanto riguarda functiosn che chiusure di ritorno? –

+0

Puoi fare un esempio? Non vedo perché si comporterebbe diversamente. – leonardoborges

Problemi correlati