L'idea, se ho capito bene, è che si sta cercando di spegnere una funzione prima di un componente è reso nel tuo test. Nel tuo caso, componentWillMount
viene chiamato solo una volta nel ciclo di vita di un componente, immediatamente prima del rendering del componente. Quindi non puoi semplicemente rendere il componente e quindi lo stub out della funzione,, deve essere fatto prima che il rendering si verifichi.
Prendiamo queste componenti, ad esempio:
parent.js
var Child = require('./child.js');
var Parent = React.createClass({
render : function() {
return (
<div className="parent">
<Child/>
</div>
);
}
});
module.exports = Parent;
child.js
var Child = React.createClass({
test : function() {
return true;
},
render : function() {
if (this.test) {
throw('boom');
}
return (
<div className="child">
Child
</div>
);
}
});
module.exports = Child;
Qui, vorremmo spegnere la funzione test
prima che il componente Child sia reso, altrimenti, esploderà.
Sono stato in grado di farlo utilizzando jasmine-react. Queste funzioni di supporto forniscono alcune funzionalità utili durante l'esecuzione di test, quasi fino al punto in cui lo TestUtils
può essere abbandonato completamente.
jasmineReact.render(component, [container])
esegue il rendering di un'istanza di component
nel nodo DOM specificato in [container]
. È come TestUtils.renderIntoDocument()
, tranne che esegue il rendering del componente in un nodo DOM collegato anziché in un nodo DOM staccato. Effettuerà anche le operazioni di pulizia necessarie al termine del test.
jasmineReact.spyOnClass(componentClass, functionName)
interromperà una particolare funzione appartenente a una classe componente. Questo comportamento viene mantenuto fino alla fine del test, il che significa che è possibile chiamare questa funzione prima del in cui viene eseguito il rendering di un componente. Questo, se ho capito bene, è quello che stai cercando.
Quindi, utilizzando queste due funzioni di aiuto, posso scrivere un test per il codice mostrato sopra che sembra qualcosa di simile:
var React = require('react/addons'),
Parent = require('./parent.js'),
Child = require('./child.js'),
jasmineReact = require('jasmine-react-helpers');
describe('Parent', function() {
it('does not blow up when rendering', function() {
jasmineReact.spyOnClass(Child, 'test').and.returnValue(false);
var parentInstance = jasmineReact.render(<Parent/>, document.body); //does not blow up
expect(parentInstance).toBeTruthy(); //passes
});
});
fatemi sapere se avete domande.
Si consiglia di non prendere in giro esso. Se vuoi assicurarti che il tuo componente funzioni, prendi in giro tutto ciò che passi come un sostegno, prendi in giro tutte le dipendenze, ma non prendere in giro il componente stesso. –
Non sono d'accordo. Se OP sta cercando di scrivere test unitari che testano le funzioni all'interno del suo componente, non è affatto insolito per lui voler eliminare altre funzioni che potrebbero influenzare questi test. OP: quale framework di test stai usando? A seconda della tua risposta, potrei avere una soluzione per te. –
Grazie per i tuoi commenti. @ MichaelParker Sto usando karma e moka. –