Nel nostro team di sviluppatori JavaScript abbiamo abbracciato lo stile di scrittura redux/react di puro codice funzionale. Tuttavia, sembra che abbiamo difficoltà a testare il nostro codice. Si consideri il seguente esempio:Come testare un albero di chiamate di funzione pure in isolamento?
function foo(data) {
return process({
value: extractBar(data.prop1),
otherValue: extractBaz(data.prop2.someOtherProp)
});
}
Questa funzione di chiamata dipende chiamate verso process
, extractBar
e extractBaz
, ognuno dei quali può chiamare altre funzioni. Insieme, potrebbero richiedere una simulazione non banale per il parametro data
da costruire per il test.
Nel caso in cui accettassimo la necessità di creare un simile oggetto fittizio e lo facessimo effettivamente nei test, troviamo rapidamente casi di test difficili da leggere e mantenere. Inoltre, molto probabilmente porta a testare sempre la stessa cosa, poiché probabilmente dovrebbero essere scritti anche i test unitari per , extractBar
e extractBaz
. Il test per ogni possibile caso limite implementato da queste funzioni tramite l'interfaccia foo
è ingombrante.
Abbiamo alcune soluzioni in mente, ma non mi piacciono molto, in quanto nessuno dei due sembra uno schema che abbiamo visto in precedenza.
Soluzione 1:
function foo(data, deps = defaultDeps) {
return deps.process({
value: deps.extractBar(data.prop1),
otherValue: deps.extractBaz(data.prop2.someOtherProp)
});
}
Soluzione 2:
function foo(
data,
processImpl = process,
extractBarImpl = extractBar,
extractBazImpl = extractBaz
) {
return process({
value: extractBar(data.prop1),
otherValue: extractBaz(data.prop2.someOtherProp)
});
}
Soluzione 2 inquina foo
firma del metodo molto rapidamente il numero di chiamate funzione dipendente aumenta.
Soluzione 3:
Basta accettare il fatto che foo
è un'operazione complicata composto e testarlo nel suo complesso. Si applicano tutti gli inconvenienti
Si prega di suggerire altre possibilità. Immagino che questo sia un problema che la comunità di programmazione funzionale deve aver risolto in un modo o nell'altro.