Se moquant de promis en fonction de la demande avec la Plaisanterie
Je suis en train de test de l'unité d'une fonction à l'aide de la Plaisanterie, et je vais avoir de la difficulté à affronter la blague simulacre de modules (l'équivalent de rewire ou proxyquire en nodejs monde).
En fait, je suis en train de tester, qu'un espion a été appelée sur la moqué de module avec certains paramètres. Voici la fonction que je veux tester.
NB : le test actuel ne concerne que le "fetch(...)" partie, je suis en train de tester, que l'extraction a été appelé avec le bon paramètre.
export const fetchRemote = slug => {
return dispatch => {
dispatch(loading());
return fetch(Constants.URL + slug)
.then(res => res.json())
.then(cmp => {
if (cmp.length === 1) {
return dispatch(setCurrent(cmp[0]));
}
return dispatch(computeRemote(cmp));
});
};
};
La fonction renvoyée agit comme une fermeture, et ainsi de "capture" le nœud-extraction du module externe que je veux en dérision.
Voici le test que j'essaie de faire passer vert :
it('should have called the fetch function wih the good const parameter and slug', done => {
const slug = 'slug';
const spy = jasmine.createSpy();
const stubDispatch = () => Promise.resolve({json: () => []});
jest.mock('node-fetch', () => spy);
const dispatcher = fetchRemote(slug);
dispatcher(stubDispatch).then(() => {
expect(spy).toHaveBeenCalledWith(Constants.URL + slug);
done();
});
});
EDIT : La première réponse m'a beaucoup aidé concernant l'écriture de l'essai, j'ai maintenant la suivante :
it('should have called the fetch function wih the good const parameter and slug', done => {
const slug = 'slug';
const stubDispatch = () => null;
const spy = jest.mock('node-fetch', () => Promise.resolve({json: () => []}));
const dispatcher = fetchRemote(slug);
dispatcher(stubDispatch).then(() => {
expect(spy).toHaveBeenCalledWith(Constants.URL + slug);
done();
});
});
Mais maintenant, voici l'erreur que j'ai :
console.error node_modules/core-js/modules/es6.promise.js:117
Unhandled promise rejection [Error: expect(jest.fn())[.not].toHaveBeenCalledWith()
jest.fn() value must be a mock function or spy.
Received:
object: {"addMatchers": [Function anonymous], "autoMockOff": [Function anonymous], "autoMockOn": [Function anonymous], "clearAllMocks": [Function anonymous], "clearAllTimers": [Function anonymous], "deepUnmock": [Function anonymous], "disableAutomock": [Function anonymous], "doMock": [Function anonymous], "dontMock": [Function anonymous], "enableAutomock": [Function anonymous], "fn": [Function anonymous], "genMockFn": [Function bound getMockFunction], "genMockFromModule": [Function anonymous], "genMockFunction": [Function bound getMockFunction], "isMockFunction": [Function isMockFunction], "mock": [Function anonymous], "resetModuleRegistry": [Function anonymous], "resetModules": [Function anonymous], "runAllImmediates": [Function anonymous], "runAllTicks": [Function anonymous], "runAllTimers": [Function anonymous], "runOnlyPendingTimers": [Function anonymous], "runTimersToTime": [Function anonymous], "setMock": [Function anonymous], "unmock": [Function anonymous], "useFakeTimers": [Function anonymous], "useRealTimers": [Function anonymous]}]
Vous devez vous connecter pour publier un commentaire.
Tout d'abord vous avez besoin de retourner une promesse quand les tests de code asynchrone. Et votre espion a besoin de retourner un résolus ou rejeté promesse.
expect(spy.mock)
au lieu deexpect(spy)
?fetch
dans votre module ou utilisez-vous le natif JS mise en œuvre?