Ich erstelle ein Projekt mit create-app-component, das eine neue App mit Build-Skripten (Babel, Webpack, Jest) konfiguriert.Kann ein Modul nicht mit Jest verhöhnen und Funktionsaufrufe testen
Ich schrieb eine React-Komponente, die ich versuche zu testen. Die Komponente benötigt eine andere Javascript-Datei, die eine Funktion freigibt.
Mein Search.js Datei
export {
search,
}
function search(){
// does things
return Promise.resolve('foo')
}
Meine Komponente reagieren:
import React from 'react'
import { search } from './search.js'
import SearchResults from './SearchResults'
export default SearchContainer {
constructor(){
this.state = {
query: "hello world"
}
}
componentDidMount(){
search(this.state.query)
.then(result => { this.setState({ result, })})
}
render() {
return <SearchResults
result={this.state.result}
/>
}
}
In meinen Unit-Tests, ich, dass die Methode search
überprüfen will mit den richtigen Argumenten aufgerufen wurde.
Meine Tests in etwa so aussehen, dass:
import React from 'react';
import { shallow } from 'enzyme';
import should from 'should/as-function';
import SearchResults from './SearchResults';
let mockPromise;
jest.mock('./search.js',() => {
return { search: jest.fn(() => mockPromise)};
});
import SearchContainer from './SearchContainer';
describe('<SearchContainer />',() => {
it('should call the search module',() => {
const result = { foo: 'bar' }
mockPromise = Promise.resolve(result);
const wrapper = shallow(<SearchContainer />);
wrapper.instance().componentDidMount();
mockPromise.then(() => {
const searchResults = wrapper.find(SearchResults).first();
should(searchResults.prop('result')).equal(result);
})
})
});
Ich hatte schon eine harte Zeit, herauszufinden, wie jest.mock
Arbeit zu machen, weil es Variablen erfordert von mock
vorangestellt werden.
Aber wenn ich Argumente zu der Methode search
testen möchte, muss ich die verspottete Funktion in meinen Tests verfügbar machen.
Wenn ich den spöttischen Teil verwandeln, um eine Variable zu verwenden:
const mockSearch = jest.fn(() => mockPromise)
jest.mock('./search.js',() => {
return { search: mockSearch};
});
ich diesen Fehler:
TypeError: (0 , _search.search) is not a function
Was auch immer ich versuche, den Zugang zum jest.fn
zu haben, und die Argumenten testen, ich kann es nicht funktionieren lassen.
Was mache ich falsch?
Vielen Dank für diese sehr detaillierte Antwort. Ich werde definitiv deine Lösung versuchen. – ghusse
Während die vorherige Lösung technisch funktionieren sollte (und ich schließlich sogar herausgefunden habe, warum die 'var' notwendig war), habe ich jetzt die Antwort bearbeitet, um eine viel weniger hässliche zu verwenden, IMO. – Tomty
Danke für Ihre Hilfe. Mit der zweiten Lösung bekomme ich einen Fehler 'kann die Suche nach Eigenschaften der Suche nicht festlegen '. Die erste Lösung funktioniert: Ich muss die Lib importieren und den Jest ein für allemal aufrufen (nicht im beforeEach-Trigger). – ghusse