Jest: рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирдХрд▓ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  116рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/jest

рдореИрдВ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд╕рд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯ рджреЛрдиреЛрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдпрд╣ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ myModule.js :

export function foo() {...}
export function bar() {...}
export function baz() {...}

рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдирдореЙрдХ рдХрд░рддрд╛ рд╣реВрдВред

jest.unmock('./myModule.js');

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ foo рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рдмреИрдХрдПрдВрдб рдкрд░ рдЕрдЬрд╛рдХреНрд╕ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдмреЗрдЬреЛрдбрд╝ рд░рд╣реЗ, foo рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдордЬрд╛рдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рдлрд╝рдВрдХреНрд╢рди bar рдФрд░ baz рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ foo рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг bar() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмреЗрдЬреЛрдбрд╝ bar рдХреЙрд▓ рдХрд░реЗрдЧрд╛ foo рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ред

рдпрд╣ рдЬреЗрд╕реНрдЯ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ unmock рдФрд░ mock рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирдХрд▓ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдореЗрд░реЗ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рддреЛрдбрд╝рдирд╛ рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдпрд╣ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рддреБрдо рдХрд░ рд╕рдХрддреЗ рд╣реЛ:

jest.unmock('./myModule.js');

const myModule = require('myModule');
myModule.foo = jest.fn();

рджреЗрдЦреЗрдВ http://facebook.github.io/jest/docs/api.html#mock -functions

рд╕рднреА 116 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ-рдореЙрдХ рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдПрд╕рдЯреА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрд╕ рдПрдПрд╕рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИ: https://github.com/facebook/jest/tree/master/packages / рдордЬрд╛рдХ-рдордЬрд╛рдХ

рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ, рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдпрдерди рдХрд╛ рдирдХрд▓реА (https://docs.python.org/3/library/unittest.mock-examples.html), рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдореМрд▓рд┐рдХ рдкрд░реАрдХреНрд╖рдг рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред

рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдордЬрд╛рдХ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ-рдореЙрдХ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреБрдо рдХрд░ рд╕рдХрддреЗ рд╣реЛ:

jest.unmock('./myModule.js');

const myModule = require('myModule');
myModule.foo = jest.fn();

рджреЗрдЦреЗрдВ http://facebook.github.io/jest/docs/api.html#mock -functions

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ require рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореВрд▓рднреВрдд рдЧрд▓рддрдлрд╣рдореА рд╣реИред рдЬрдм рдЖрдк require() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд┐рд╕реА рдорд╛рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, _рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореВрд▓ рд╕рдВрджрд░реНрдн_ рд░рдЦрддрд╛ рд╣реИред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рдЖрдк myModule.foo() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рд╛рдБ, рдЖрдк рдирдХрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк myModule.bar() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ foo() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ foo рдпрд╣ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ _рдЖрдкрдХрд╛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬреЛ рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛?

@cpojer

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭрддрд╛ рд╣реВрдВред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдмреЗрдмрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЖрдкрдХреЗ рднреНрд░рдо рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ ES2015 рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рдореБрдЦреНрдпрддрдГ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рд╡рд╛рддрд╛рд╡рд░рдг рдЕрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ (рд╢рд╛рдпрдж рдХреНрд░реЛрдо рдХреИрдирд░реА рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ)ред рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрдкрдХреЗ рдмреЗрдмреЗрд▓ рдХреЛрдб рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

var foo = function foo() {};
var bar = function bar() { foo(); };

exports.foo = foo;
exports.bar = bar;

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рд╣реИ рдХрд┐ рдЖрдк рдлреВ рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореБрджреНрджреЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдХрд┐ рдХреИрд╕реЗ foo рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдпрд╣ exports.foo() ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдХрд░ рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ - рдлреВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ (рд▓рдЧрднрдЧ) рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рдХреЛрдб рдЗрд╕рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:

var foo = function foo() {};
var bar = function bar() { exports.foo(); };

exports.foo = foo;
exports.bar = bar;

рдФрд░ рдлрд┐рд░ рдЕрдкрдиреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:

var module = require('../module');
module.foo = jest.fn();
module.bar();

рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣рдо рдлреЗрд╕рдмреБрдХ рдкрд░ рдпрд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо ES2015 рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЬрдмрдХрд┐ ES2015 рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдирдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдЬреЛ рдЕрднреА рдмреЗрдмрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдРрд╕реА рдХрд┐рд╕реА рднреА рдмрд╛рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╕рдЦреНрдд ES2015 рдореЙрдбреНрдпреВрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЖрдк рдЬреЛ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ jest-mock рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдХреЛ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИред рджреЛрдмрд╛рд░рд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ foo рдХреЗ рд╕реНрдерд╛рдиреАрдп рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдпрд╣рд╛рдВ рдпреЛрдЧрджрд╛рди рджреЗрдВ рдпрд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рдеред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрдЪрд╛рд░ рд╕рдВрд╣рд┐рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: https://code.facebook.com/pages/876921332402685/open-source-code-of-conduct

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдлреВ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрд╕ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлреВ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ XMLHttpRequest рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдореВрд░реНрдд)ред

@cpojer рдЖрдкрдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЕрдкрдиреА рднрд╛рд╖рд╛ рд╕реЗ рдареЗрд╕ рдкрд╣реБрдБрдЪрд╛рдИ рд╣реИ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд▓реЗрдЦрди рдореЗрдВ рдмрд╣реБрдд рдХреБрд╢рд▓ рд╣реВрдБ рдФрд░ рдореИрдВ рдЕрдкрдиреА рдмрд╛рдд ASAP рддрдХ рдкрд╣реБрдБрдЪрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рдЪреАрдЬреЛрдВ рдХреЛ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ 5 рдШрдВрдЯреЗ рдХрд╛ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рдФрд░ 2 рд╡рд┐рд╕реНрддреГрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд▓рд┐рдЦреАрдВ, рдлрд┐рд░ рдЖрдкрдиреЗ рдЗрд╕реЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдореЗрд░реЗ рджреЛрдиреЛрдВ рдмрдпрд╛рдиреЛрдВ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЕрдЧрд▓реЗ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЛ "рдореМрд▓рд┐рдХ рдЧрд▓рддрдлрд╣рдореА" рдереА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╛ рддреЛ 1) рдЖрдк рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдП рдЬреЛ рдореИрдВ рдмрдирд╛ рд░рд╣рд╛ рдерд╛, рдпрд╛ 2) рдЖрдкрдХреЛ require() рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛, рдЬреЛ рд╢реБрдХреНрд░ рд╣реИ рдХрд┐ рд╡рд┐рдХрд▓реНрдк 1 рдерд╛ред

рдореИрдВ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛, рдЕрдм рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реАрдзреЗ рдирдХрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕ рдореЗрдВ рдЗрд╕реЗ рдмрд┐рдирд╛ (рд╢рд╛рдпрдж рдзреАрдореА) рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ :(

@cpojer : рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ 5 рдорд╣реАрдиреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рдХреВрджрдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдорд┐рд▓реАред

рдЙрдкрд░реЛрдХреНрдд рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рд╕реЗ рд╣рдЯрдХрд░, рдореИрдВрдиреЗ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдореЙрдХ рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИ:

jest.unmock('./someModule.js');
import someModule from './someModule.js';

it('function1 calls function 2', () => {
    someModule.function2 = jest.fn();

    someModule.function1(...);

    expect(someModule.function2).toHaveBeenCalledWith(...);
});

рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ it(...); рдмреНрд▓реЙрдХ рд╕реЗ рдЕрд▓рдЧ рд╣реЛред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ function2 рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рд╕реБрдЭрд╛рд╡?

рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдкрд░ .mockClear рдХреЛ beforeEach рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдЖрдк Jest 16 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ jest.clearAllMocks() рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрд░реЗ @cpojer! рдореИрдВ рдЬреЗрд╕реНрдЯ 16 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рди рддреЛ jest.clearAllMocks() рдпрд╛ someModule.function2.mockClear() рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдирдХрд▓реА рдПрдХ рд╕рдВрдкреВрд░реНрдг рдореЙрдбреНрдпреВрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЖрдпрд╛рддрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВред рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдмрд╛рдж рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рддреЛ рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдирдореВрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЛрд╣рд░рд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░?

@cpojer -

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдлреВ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрд╕ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлреВ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ XMLHttpRequest рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдореВрд░реНрдд)ред

рдореИрдВ рдЬреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБ рдФрд░ рдореИрдВ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ XMLHttpRequest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ axios рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рдмрд▓реНрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ XMLHttpRequest рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЦреБрдж рд╣реА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ред рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ?

рдзрдиреНрдпрд╡рд╛рдж!

рд╣рд╛рдБ, рдРрд╕рд╛ рдХреБрдЫ рдЖрдкрдХреЛ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП! :) рдПрдХ рдЕрдЪреНрдЫреЗ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ jest.fn рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ :D

@cpojer рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ: https://github.com/facebook/jest/issues/936#issuecomment -214939935

рдЖрдк рдЗрд╕реЗ ES2015 рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ?

// myModyle.js
export foo = (string) => "foo-" + string
export bar = (string2) => foo(string2)

// myModule.test.js
var module = require('./myModule');

// how do I mock foo here so this test passes?
expect(bar("hello")).toEqual("test-hello")

рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрд╕ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рдХреЙрдиреНрд╕реНрдЯ/рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

`` javascript function mockFunctions() { const original = require.requireActual('../myModule'); return { ...original, //Pass down all the exported objects test: jest.fn(() => {console.log('I didnt call the original')}), someFnIWantToCurry: {console.log('I will curry the original') return jest.fn((...args) => original.someFnIWantToCurry(...args)}), } jest.mock('../myModule', () => mockFunctions()); const storage = require.requireMock('../myModule');

@ainesophour , рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛
рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЗрд╕реНрдЯ 18.1 (рдФрд░ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк 0.9.4) рдкрд░ рд╣реВрдВ

...<codes from comment above>..

// Let's say the original myModule has a function doSmth() that calls test()
storage.doSmth();
expect(storage.test).toHaveBeenCalled();

рдЗрд╕рдХреЗ рдмрд╛рдж рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛:

expect(jest.fn()).toHaveBeenCalled()
Expected mock function to have been called.

@huyph рдЖрдкрдХреЛ рдЬреЗрд╕реНрдЯ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА doSmth рд╡рд┐рдзрд┐ рдФрд░ рдЕрдкрдиреА рдЯреЗрд╕реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдирдХрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдореЙрдХрд┐рдВрдЧ рдХреЛрдб рдХрд╛ рд╕реНрдирд┐рдкреЗрдЯ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЬрд╛рдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ

@ainesophaur ... test() рдкрджреНрдзрддрд┐ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ? рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛: test: jest.fn(() => {console.log('I didnt call the original')}),

@ainesophour рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреАред рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛ред рдпрд╣ рдХрднреА рднреА рдирдХрд▓реА рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ, рдЙрдореНрдореАрдж рдХрднреА рдкреВрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ ... рдХрд╛рд╢ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реЛрддрд╛ред

@cpojer рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ

@rantonmattei рдФрд░ @huyph рдореБрдЭреЗ рдЖрдкрдХреА рдирдХрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛

рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛ рд░рд╣рд╛ рд╣реИ

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдкрд░рд┐рднрд╛рд╖рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдпрд╣ __mocks__/react-native/Libraries/Utilities/dismissKeyboard.js рдЕрдВрддрд░реНрдЧрдд рдПрдХ рдирдХрд▓реА рдлрд╝рд╛рдЗрд▓ рд╣реИ

function storeMockFunctions() {
  return jest.fn().mockImplementation(() => true);
}
jest.mock('react-native/Libraries/Utilities/dismissKeyboard', () => storeMockFunctions(), { virtual: true });
const dismissKeyboard = require('react-native/Libraries/Utilities/dismissKeyboard');
exports = module.exports = storeMockFunctions;

рдореБрдЭреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдерд╛ рдЬреИрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЗрд╕реНрдЯ рдЗрд╕реЗ __mocks__ рдореЗрдВ рдвреВрдВрдвреЗрдЧрд╛ рдФрд░ рдлрд┐рд░ рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛

expect(dismissKeyboard.mock.calls).toHaveLength(1);

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдкрд░рд┐рднрд╛рд╖рд╛

export const setMerchantStores = (stores) => storage.set('stores', stores);

рдореЙрдХ рдХреЗ рд╕рд╛рде рдЯреЗрд╕реНрдЯ рдлрд╛рдЗрд▓

const { storeListEpic, offerListEpic } = require('../merchant');

function storeMockFunctions() {
  const original = require.requireActual('../../common/Storage');
  return {
    ...original,
    setMerchantStores: jest.fn((...args) => original.setMerchantStores(...args)),
    setMerchantOffers: jest.fn((...args) => original.setMerchantOffers(...args)),
  };
}
jest.mock('../../common/Storage', () => storeMockFunctions());
import * as storage from '../../common/Storage';

afterEach(() => {
  storage.setMerchantStores.mockClear();
});

it('handle storeListEpic type STORE_LIST_REQUEST -> STORE_LIST_SUCCESS', async () => {
  const scope = nock('http://url')
  .get('/api/merchant/me/stores')
  .reply(200, storeData);
  const result = await storeListEpic(ActionsObservable.of(listStores())).toPromise();
  expect(storage.setMerchantStores.mock.calls).toHaveLength(1);
  expect(await storage.getMerchantStores()).toEqual({ ids: storesApiData.result, list: storesApiData.entities.store});
});

@Ainesophaur рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдЬреЗрд╕реНрдЯ 18.1 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣рд╛рдБ рдореЗрд░реЗ рдХреЛрдб рд╣реИрдВ:

it('should save session correctly', () => {

  function mockFunctions() {
    const original = require.requireActual('./session');
    return {
      ...original,
      restartCheckExpiryDateTimeout: jest.fn((() => {
        console.log('I didn\'t call the original');
      })),
    }
  }

  jest.mock('./session', () => mockFunctions());
  const mockSession = require('./session');

  // NOTE: saveSession() will call the original restartCheckExpiryDateTimeout() instead of my
  // mock one. However, mockSession.restartCheckExpiryDateTimeout() does call the mock one
  mockSession.saveSession('', getTomorrowDate(), 'AUTH');

  // mockSession.restartCheckExpiryDateTimeout(); // does print out "I didn't call the original"

  expect(mockSession.restartCheckExpiryDateTimeout).toHaveBeenCalled();
});

session.js

export function saveSession(sessionId, sessionExpiryDate, authToken) {
  ....
  restartCheckExpiryDateTimeout(sessionExpiryDate);
  ...
}
....

export function restartCheckExpiryDateTimeout(...) {
....
}

рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдБ? @cpojer

@huyph рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ saveSession рдореЙрдбреНрдпреВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдФрд░ module.restartCheckExpiryDateTimeout рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд restartCheckExpiryDateTimeout рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХрд╛ рдирдХрд▓реА module.restartCheckExpiryDateTimeout saveSession рджреНрд╡рд╛рд░рд╛ module.restartCheckExpiryDateTimeout рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ saveSession рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд restartCheckExpiryDateTimeout рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдПрдХ рдХреЙрдиреНрд╕ рдХреЛ saveSession рдЕрд╕рд╛рдЗрди рдХрд░реВрдВрдЧрд╛ рдФрд░ рдлрд┐рд░ saveSession.restartCheckExpiryDateTimeout = () => {...logic} рдХрд░реВрдВрдЧрд╛ред рдлрд┐рд░ saveSession.saveSession рднреАрддрд░ рд╕реЗ, рдХреЗрд╡рд▓ restartCheckExpiryDateTimeout рдмрдЬрд╛рдп saveSession.restartCheckExpiryDateTimeout рдХреЙрд▓ рдХрд░реЗрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди saveSession рдмрдЬрд╛рдп рдЕрдкрдирд╛ рдирдпрд╛ рдХреЙрдиреНрд╕ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ рдЬреЛ рддрдм рдЖрдкрдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдЬрдм рдЖрдк рдЕрдкрдиреЗ someVar.saveSession() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ saveSession.restartCheckExpiryDateTimeout() рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЕрдм рдирдХрд▓реА рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдХрд┐ restartCheckExpiryDateTimeout() рдПрдХ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИред saveSession() рднреАрддрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ ... (рдКрдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ)ред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ module.saveSession() рдХреЛ рд╕рд╣реА module.restartCheckExpiryDateTimeout() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╣ рджреВрдВрдЧрд╛ рдЬреЛ рдЖрдк рдКрдкрд░ рд╕реБрдЭрд╛рдПрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред saveSession() рдФрд░ restartCheckExpiryDateTimeout() рдХреЛ рджреВрд╕рд░реЗ рдХреЙрдиреНрд╕реНрдЯ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ред рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ saveSession рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реЗрд╡рд╕реЗрд╢рди рд╣реИ
рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рднрд╛рдИ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдУред рдореИрдВ рдЗрд╕рдореЗрдВ рдХрдИ рдмрд╛рд░ рднрд╛рдЧрд╛
рдФрд░ рдореИрдВрдиреЗ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╡рд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

8 рдордИ, 2017 рдХреЛ рд░рд╛рдд 8:38 рдмрдЬреЗ, "рд╣реБрдп рдлрд╛рдо" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдХрд┐ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВрдЪреЗрдХрдПрдХреНрд╕рдкрд┐рд░реАрдбреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ() рдПрдХ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рд╕рдорд╛рд░реЛрд╣ред saveSession() рдХреЗ рднреАрддрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ ...

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рд╡рд╣ рдореИрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рджреВрдВрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рдж

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/jest/issues/936#issuecomment-300029003 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AEeBdsmpOOmzvcUHB3D_-Z7MChIzt10Pks5r37WYgaJpZM4IPGAH
.

рдмрд╕ рдХреЛрд╢рд┐рд╢ рдХреА..рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐:

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: (рдпрд╛рдиреА рдореВрд▓ рдкреБрдирд░рд╛рд░рдВрдн рдЪреЗрдХрдПрдХреНрд╕рдкрд┐рд░реАрдбреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ() рдЕрднреА рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)

export session = {
   saveSession: () => {
      session.restartCheckExpiryDateTimeout();
   },
   restartCheckExpiryDateTimeout: () => {},
}

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: (рдпрд╛рдиреА рдирдХрд▓реА рдкреБрдирд░рд╛рд░рдВрдн рдЪреЗрдХрдПрдХреНрд╕рдкрд┐рд░реАрдбреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ() рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЕрдВрддрд░ рддреАрд░ рдХреЗ рд░реВрдк рдХреЗ рдмрдЬрд╛рдп function() рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ, рдФрд░ this. рдмрдЬрд╛рдп session.

export session = {
   saveSession: function() {
      this.restartCheckExpiryDateTimeout();
   },
   restartCheckExpiryDateTimeout: () => {},
}

рдЗрди рдХреЛрдбреЛрдВ рдХреЛ рдордЬрд╛рдХ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ ....

рдЙрдиреНрд╣реЗрдВ рдкреВрдЬреЛ рдХреЗ рдмрдЬрд╛рдп рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐
рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдЪрд░ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдлрд╣рд░рд╛рддрд╛ рд╣реИред рд╣рдо рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛
рдкрд░реАрдХреНрд╖рдг, рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ .. рдореБрдЭреЗ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╕рд╛рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ
рдЙрд╕рдиреЗ рдордЬрд╛рдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рдпрд╛рдж рд╣реИ рдФрд░ рдореБрдЭреЗ рдЕрдВрддрддрдГ рдпрд╛рдж рд╣реИ
рдПрдХ рд╕рдорд╛рдзрд╛рди рдвреВрдБрдврдирд╛ред

9 рдордИ, 2017 рдХреЛ рджреЛрдкрд╣рд░ 12:53 рдмрдЬреЗ, "рд╣реНрдпреВ рдлрд╛рдо" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдмрд╕ рдХреЛрд╢рд┐рд╢ рдХреА..рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐:

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: (рдпрд╛рдиреА рдореВрд▓ рдкреБрдирд░рд╛рд░рдВрднрдЪреЗрдХрдПрдХреНрд╕рдкрд┐рд░реАрдбреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ() рд╣реИ
рдЕрднреА рднреА рдмреБрд▓рд╛рдУ)

рдирд┐рд░реНрдпрд╛рдд рд╕рддреНрд░ = {
рд╕реЗрд╡ рд╕рддреНрд░: () => {
session.restartCheckExpiryDateTimeout ();
},
рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВрдЪреЗрдХрдПрдХреНрд╕рдкрд┐рд░реАрдбреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ: () => {},
}

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: (рдпрд╛рдиреА рдореВрд▓ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВрдЪреЗрдХрдПрдХреНрд╕рдкрд╛рдпрд░реАрдбреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ() рд╣реИ
рдЕрднреА рднреА рдмреБрд▓рд╛рдУ)

рдирд┐рд░реНрдпрд╛рдд рд╕рддреНрд░ = {
рд╕реЗрд╡ рд╕реЗрд╢рди: рдлрдВрдХреНрд╢рди () {
this.restartCheckExpiryDateTimeout ();
},
рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВрдЪреЗрдХрдПрдХреНрд╕рдкрд┐рд░реАрдбреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ: () => {},
}

рдЗрди рдХреЛрдбреЛрдВ рдХреЛ рдордЬрд╛рдХ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ ....

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/jest/issues/936#issuecomment-300060975 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AEeBdrRQExycPYiGtvm7qYi5G87w6b6Oks5r3_FlgaJpZM4IPGAH
.

@sorahn рдПрдХ рд╣реА рдореБрджреНрджрд╛ред es6 + babel , рдХреИрд╕реЗ рдирдХрд▓ рдХрд░реЗрдВ?
@cpojer рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ es6 + babel , export const function xx() {} , рдХрдИ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ, Jest рдирд╛рдордХ рдореЙрдбреНрдпреВрд▓ (рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ (рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛? рдореИрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╣реА рд╣реВрдВред рдХреЗрд╡рд▓ commonjs рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП, рдЬреЗрд╕реНрдЯ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирдХрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@ainesophour рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдорд╛рдкрд╛рдВрдХ:

export const getMessage = (num: number): string => {
  return `Her name is ${genName(num)}`;
};

export function genName(num: number): string {
  return 'novaline';
}

рдкрд░реАрдХреНрд╖рдг:

function mockFunctions() {
  const original = require.requireActual('../moduleA');
  return {
    ...original,
    genName: jest.fn(() => 'emilie')
  }
}
jest.mock('../moduleA', () => mockFunctions());
const moduleA = require('../moduleA');

describe('mock function', () => {

  it('t-0', () => {
    expect(jest.isMockFunction(moduleA.genName)).toBeTruthy();
  })

  it('t-1', () => {

    expect(moduleA.genName(1)).toBe('emilie');
    expect(moduleA.genName).toHaveBeenCalled();
    expect(moduleA.genName.mock.calls.length).toBe(1);
    expect(moduleA.getMessage(1)).toBe('Her name is emilie');
    expect(moduleA.genName.mock.calls.length).toBe(2);

  });

});

рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо:

FAIL  jest-examples/__test__/mock-function-0.spec.ts
  тЧП mock function тА║ t-1

    expect(received).toBe(expected)

    Expected value to be (using ===):
      "Her name is emilie"
    Received:
      "Her name is novaline"

      at Object.it (jest-examples/__test__/mock-function-0.spec.ts:22:35)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

  mock function
    тЬУ t-0 (1ms)
    тЬХ t-1 (22ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 passed, 2 total
Snapshots:   0 total
Time:        0.215s, estimated 1s

рдКрдкрд░ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдоред рдЖрдкрдХрд╛
рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдХреЛрдк рдХрд┐рдП рдЧрдП рд╕рд┐рдмрд▓рд┐рдВрдЧ рдореЗрдердб рдмрдирд╛рдо рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реА рд╣реИрдВ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрдпрд╛рдд рд╡рд┐рдзрд┐ (рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдирдХрд▓реА рд╣реИ)

31 рдордИ, 2017 рдХреЛ рджреЛрдкрд╣рд░ 2:00 рдмрдЬреЗ, "рдиреЛрд╡рд╛рд▓рд╛рдЗрди" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@ainesophour https://github.com/ainesophour рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдорд╛рдкрд╛рдВрдХ:

рдирд┐рд░реНрдпрд╛рдд рд╕реНрдерд┐рд░рд╛рдВрдХ getMessage = (рд╕рдВрдЦреНрдпрд╛: рд╕рдВрдЦреНрдпрд╛): рд╕реНрдЯреНрд░рд┐рдВрдЧ => {
рд╡рд╛рдкрд╕реА Her name is ${genName(num)} ;
};
рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ genName (рд╕рдВрдЦреНрдпрд╛: рд╕рдВрдЦреНрдпрд╛): рд╕реНрдЯреНрд░рд┐рдВрдЧ {
рд╡рд╛рдкрд╕реА 'рдиреЛрд╡рд╛рд▓рд┐рди';
}

рдкрд░реАрдХреНрд╖рдг:

рдлрдВрдХреНрд╢рди рдореЙрдХрдлрдВрдХреНрд╢рди () {
рдореВрд▓рд╛рдВрдХ рдореВрд▓ = рдЖрд╡рд╢реНрдпрдХрддрд╛ред рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ ('../рдореЙрдбреНрдпреВрд▓рдП');
рд╡рд╛рдкрд╕реА {
...рдореВрд▓,
genName: jest.fn(() => 'рдПрдорд┐рд▓реА')
}
}jest.mock('../moduleA', () => mockFunctions());const moduleA = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('../moduleA');
рд╡рд░реНрдгрди рдХрд░реЗрдВ ('рдореЙрдХ рдлрдВрдХреНрд╢рди', () => {

рдпрд╣ ('рдЯреА -0', () => {
рдЙрдореНрдореАрдж (jest.isMockFunction(moduleA.genName)).toBeTruthy();
})

рдпрд╣ ('рдЯреА -1', () => {

expect(moduleA.genName(1)).toBe('emilie');
expect(moduleA.genName).toHaveBeenCalled();
expect(moduleA.genName.mock.calls.length).toBe(1);
expect(moduleA.getMessage(1)).toBe('Her name is emilie');
expect(moduleA.genName.mock.calls.length).toBe(2);

});

});

рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо:

рдЕрд╕рдлрд▓ рдордЬрд╝рд╛рдХ-рдЙрджрд╛рд╣рд░рдг/__test__/mock-function-0.spec.ts
рдирдХрд▓реА рд╕рдорд╛рд░реЛрд╣ тА║ t-1

expect(received).toBe(expected)

Expected value to be (using ===):
  "Her name is emilie"
Received:
  "Her name is novaline"

  at Object.it (jest-examples/__test__/mock-function-0.spec.ts:22:35)
  at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

рдирдХрд▓реА рд╕рдорд╛рд░реЛрд╣
рдЯреА-0 (1ms)
рдЯреА-1 (22ms)

рдЯреЗрд╕реНрдЯ рд╕реВрдЯ: 1 рд╡рд┐рдлрд▓, 1 рдХреБрд▓
рдЯреЗрд╕реНрдЯ: 1 рдЕрд╕рдлрд▓, 1 рдЙрддреНрддреАрд░реНрдг, рдХреБрд▓ 2
рд╕реНрдиреИрдкрд╢реЙрдЯ: рдХреБрд▓ 0
рд╕рдордп: 0.215s, рдЕрдиреБрдорд╛рдирд┐рдд 1s

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/jest/issues/936#issuecomment-305091749 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AEeBdv6SafXlTtKo3DNeFWhbL6gV9l0Gks5r_QHjgaJpZM4IPGAH
.

@ainesophour : рдореИрдВрдиреЗ export class Session { } рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╣реИ: рдЬрд╣рд╛рдВ function рддреАрд░ () => рдмрдЬрд╛рдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ:

export const session = {
   saveSession: function() {
      this.restartCheckExpiryDateTimeout();
   },
   restartCheckExpiryDateTimeout: () => {},
}

рдпрд╣ рдЬреЗрд╕реНрдЯ 20.0.3 . рдкрд░ рд╣реИ

рдореИрдВ рдЬреЛ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрд╕ рд░реИрдкрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЙрд╕ рд░реИрдкрд░ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХреЙрдиреНрд╕ рдПрдлрдПрдирдПрд╕)ред рдлрд┐рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ fns.functionName рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдореИрдВ fns.functionName рдлрд╝рдВрдХреНрд╢рди рдХреЛ jest.fn() рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

рдЬрдм рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдореЙрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЬрдм рд╣рдо рдореЙрдХ рдлрдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореЙрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдкрд╛рд╕ 2 рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдП рдЧрдП рдереЗ:
import { getCurrentDate, getStartEndDatesForTimeFrame } from ./../_helpers/date';
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ getStartEndDatesForTimeFrame getCurrentDate рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде getCurrentDate рдкрд░реАрдХреНрд╖рдг рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирдХрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ getStartEndDatesForTimeFrame рдкрд░реАрдХреНрд╖рдг рдирдХрд▓реА getCurrentDate рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯрдЕрдк рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ (рдЬреИрд╕реЗ Date.now = jest.fn(() => "2017-11-16T20:33:09.071Z"); рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

export const getCurrentDate = () => new Date();
export const getStartEndDatesForTimeFrame = (timeFrame) => {
  ...
  const todayDate = getCurrentDate();
  ...
  switch (timeframe) {
    case TimeFrames.TODAY:
      console.log(todayDate); // this always prints the real value in tests instead of the mocked one
      start = new Date(todayDate.getFullYear(), todayDate.getMonth(), todayDate.getDate(), 0, 0, 0);
      end = new Date(
        todayDate.getFullYear(),
        todayDate.getMonth(),
        todayDate.getDate(), 23, 59, 59,
      );
      break;
  ...
  return { start: start.toISOString(), end: end.toISOString() }
};
function mockFunctions() {
  const original = require.requireActual('../../_helpers/date');
  return {
    ...original,
    getCurrentDate: jest.fn(() => '2017-11-16T20:33:09.071Z'),
  }
}
jest.mock('../../_helpers/date', () => mockFunctions());
const dateModule = require.requireMock('../../_helpers/date');

describe('getCurrentDate', () => {
  it('returns the mocked date', () => {
    expect(dateModule.getCurrentDate()).
      toBe('2017-11-16T20:33:09.071Z'); // this works well and returns the mocked value
  });
});

describe('getStartEndDatesForTimeFrame', () => {
  it('returns the start and end dates for today', () => {
    expect(dateModule.getStartEndDatesForTimeFrame('today')).toEqual(
      { 'start': '2017-11-15T23:00:00.000Z', 'end': '2017-11-16T22:59:59.000Z' }
    ); // this one uses the original getCurrentDate instead of the mocked one :(
  });
});

рддреЛ getStartEndDatesForTimeFrame рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рди рдХрд┐ рдирдХрд▓реАред

рдореИрдВрдиреЗ @ainesophaur рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реБрдЭрд╛рд╡ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рд╣реИ - рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рднреАрддрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдХреЗ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдХреЛрдкреНрдб рднрд╛рдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрди рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ:

// imageModel.js
const model = {
  checkIfImageExists,
  getImageUrl,
  generateImagePreview
}
export default model

async function checkIfImageExists(...) {}
async function getImageUrl() {}
async function generateImagePreview() {
  // I am calling it as `model` object's method here, not as a locally scoped function
  return model.getImageUrl(...)
}

// imageModel.test.js
import imageModel from './imageModel'

test('should mock getImageUrl called within the same file', async () => {
  imageModel.getImageUrl = jest.fn().mockReturnValueOnce(Promise.resolve())

  await imageModel.generateImagePreview()

  expect(imageModel.getImageUrl).toBeCalled()
})

@ рдорд┐рд▓реБрдУрд╢реА рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЬрдм рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рдЧрд▓рдд" рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:
jest.mock('src/folder/file.func, () => {return 'whatever i want'})

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЯреБрдХрдбрд╝рд╛ .func

@miluoshi @Rdlenke рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдирд╛рдорд┐рдд рдирд┐рд░реНрдпрд╛рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рддреЛ рдЖрдк import * as model рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ model.generateImagePreview = jest.fn(() => Promise.resolve); рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЖрдк рдЗрд╕реЗ рд╕рд┐рдиреЙрди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдкрд░рдЦреЗрдВрдЧреЗ? рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рджреЗрдЦреЗрдВ https://github.com/facebook/jest/issues/936#issuecomment-214939935), рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ ESM рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рд╕реЗ func2 рднреАрддрд░ func1 func2 рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдЗрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╣реВрдВрдЧрд╛ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмреЗрдмреЗрд▓ рдореЛрдб рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА "testImport" рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИ
рдФрд░ рдкрд╣рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ
рдкрд░реАрдХреНрд╖рдг рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

рд╕реЛрдо, 18 рджрд┐рд╕рдВрдмрд░, 2017 рдХреЛ рд╢рд╛рдо 5:00 рдмрдЬреЗ, рдЬрд┐рдо рдореВрдбреА рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ https://github.com/simenb , рдореИрдВрдиреЗ рдХреБрдЫ рдмрджрд▓ рджрд┐рдпрд╛ рдерд╛
рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕рд┐рдиреЙрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛, рддрдм рднреА рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ
рдЬрд┐рд╕реЗ рд╕реБрд▓рдЭрд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/jest/issues/936#issuecomment-352488400 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AQRY9a5-s2_bjCWKNw5WiAJW-JeBf8W3ks5tBpoygaJpZM4IPGAH
.

--

рдбреИрд░реЗрди рдХреНрд░реЗрд╕рд╡реЗрд▓
рдЕрдиреБрдмрдВрдз рдбреЗрд╡рд▓рдкрд░ | рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб
рдИ-рдореЗрд▓: [email protected]
рдлрд╝реЛрди:
рд╡реЗрдмрд╕рд╛рдЗрдЯ: http://www.develer.co.uk

рдпрд╣ рдИ - рдореЗрд▓ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
рдЪреЗрддрд╛рд╡рдиреА: рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд╛рдпрд░рд╕ рдИрдореЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛
рд╡рд╛рдпрд░рд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдИрдореЗрд▓ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреБрд▓рдЧреНрдирдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб рдХрд┐рд╕реА рднреА рд╡рд╛рдпрд░рд╕ рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджрд╛рдпрд┐рддреНрд╡ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рдИрдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рддред рдИ-рдореЗрд▓ рд╕рдВрдЪрд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА
рд╕реБрд░рдХреНрд╖рд┐рдд рдпрд╛ рддреНрд░реБрдЯрд┐ рдореБрдХреНрдд рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦреЛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рджреЗрд░ рд╕реЗ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рд╡рд╛рдпрд░рд╕ рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░реЗрд╖рдХ
рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдпрд╛ рдЪреВрдХ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА, рдЬреЛ рдИ-рдореЗрд▓ рд╕рдВрдЪрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред

рдЪреЗрддрд╛рд╡рдиреА: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддреА рд╣реИ
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рдИрдореЗрд▓ рдореЗрдВ рдХреЛрдИ рд╡рд╛рдпрд░рд╕ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдХрдВрдкрдиреА рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА
рдЗрд╕ рдИрдореЗрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдиреБрдХрд╕рд╛рди рдпрд╛ рдХреНрд╖рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдпрд╛
рд╕рдВрд▓рдЧреНрдирдХред

рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб рдЗрдВрдЧреНрд▓реИрдВрдб рдФрд░ рд╡реЗрд▓реНрд╕ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдПрдХ рд▓рд┐рдорд┐рдЯреЗрдб рдХрдВрдкрдиреА рд╣реИред |
рдХрдВрдкрдиреА рдкрдВрдЬреАрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ 09817616 | рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдпрд╛рд▓рдп: SUITE 1 SECOND
рдлреНрд▓реЛрд░ рдПрд╡рд░рдбреАрди рд╣рд╛рдЙрд╕, рдбреЗрдирд╕реНрд▓реА рд░реЛрдб, рдмреЛрд░реНрдирдорд╛рдЙрде, рдпреВрдирд╛рдЗрдЯреЗрдб рдХрд┐рдВрдЧрдбрдо, BH7 7DU

рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЧреИрд░ рдПрд╕рд┐рдВрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореЗрд░рд╛ рд╣реИ:

//reportError.js
const functions = {};

functions._reportToServer = (error, auxData) => {
  // do some stuff
};

functions.report = (error, auxData = {}) => {
  if (shouldReportToServer()) {
    functions._reportToServer(error, auxData);
  }
};
export default functions;

// reportError.jest.js
import reportError from 'app/common/redux/lib/reportError';
reportError._reportToServer = jest.fn();

describe('test reportError', () => {
  it('reports ERROR to server as as error', () => {
   reportError.report(new Error('fml'), {});
    expect(reportError._reportToServer).toHaveBeenCalledTimes(1);
  });
});

@ рдЬрд┐рдо-рдореВрдбреА рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const spyOnExampleFunc2 = jest.spyOn(example, 'func2');
example.func1();
expect(spyOnExampleFunc2).toBeCalled();

(рдпрд╣ _only_ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрдиреНрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ)

@dinvlad рдореЗрд░реЗ рд╣реАрд░реЛ!

@Dinvlad рдХреЗ рдЙрддреНрддрд░ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░ рдореЙрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЗрдЬ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдХ рд╕рдВрдмрдВрдзрд┐рдд рдбреЙрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛, рджрд┐рдЦрд╛рдирд╛ рдпрд╛ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдореЙрдХрд┐рдВрдЧ рдкрд░ рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  • jest.isMockFunction(fn)
  • jest.genMockFromModule(рдореЙрдбреНрдпреВрд▓рдирд╛рдо)
  • jest.mock (рдореЙрдбреНрдпреВрд▓рдирд╛рдо, рдлрд╝реИрдХреНрдЯрд░реА, рд╡рд┐рдХрд▓реНрдк)
  • jest.unmock (рдореЙрдбреНрдпреВрд▓рдирд╛рдо)
  • jest.doMock (рдореЙрдбреНрдпреВрд▓рдирд╛рдо, рдлрд╝реИрдХреНрдЯрд░реА, рд╡рд┐рдХрд▓реНрдк)
  • jest.dontMock (рдореЙрдбреНрдпреВрд▓рдирд╛рдо)

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдХреЗ рдПрдХ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдХреБрдЫ mocha + sinon.js рдХреЛрдб рдХреЛ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рд╕реВрд╕ рдФрд░ рдЙрдореНрдореАрджреЗрдВ рдереАрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдореЙрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд░ рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣ рдЖрднрд╛рд╕ рд╣реЛ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдИрдПрд╕рдПрдо рдпрд╛ рдмреИрдмреЗрд▓ рдХреА рд╡рд┐рд╕реНрддреГрдд рд╕рдордЭ ... рдпрд╛ рдЕрдиреНрдп рднреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЬреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдпрд╣ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ/рд╕рдордЭрдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреЗрдЬрд╝ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред :)

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреАрдЖрд░ рдХрд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдореИрдВ

ES рдореЙрдбреНрдпреВрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореВрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

import { foo } from './example';

jest.mock('./example', () => (
  ...require.requireActual('./example'),
  foo: jest.fn()
));

test('foo should be a mock function', () => {
  expect(foo('mocked!')).toHaveBeenCalledWith('mocked!');
});

рдЙрд▓реНрдЯрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИред @joshjg рдХреЛ рд╣реИрдЯ рдЯрд┐рдкред

рдореИрдВ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдХрд╣реАрдВ рдЦреЛ рдЧрдпрд╛ рд╣реВрдВ, рдореЗрд░рд╛ рдмрд╕ рдПрдХ рд╕рд╡рд╛рд▓ рдерд╛, рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡реИрд╕реЗ рднреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдЬреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдореБрдЭреЗ jest.fn() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдХрдВрд╕реЛрд▓ рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛ рдХрд┐ рдпрд╣ jest.fn() function or a spy рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдореИрдВ рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдЕрдиреБрд░реЛрдз рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддрд╛ рд╣реВрдВ, рддреЛ рд╕рднреА рддрд░реНрдХ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдбреЗрдЯрд╛ рдЕрдЧрд▓реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛рддрд╛, рддреЛ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░рдХреЗ, рдХреНрдпрд╛ рд╡реИрд╕реЗ рднреА рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдЖрдк jest.spyOn рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ

рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рднрд▓реЗ рд╣реА рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХрдВрд╕реЛрд▓ рдбрд╛рд▓ рджрд┐рдпрд╛ред рд▓реЙрдЧ рдФрд░ рдпрд╣ рдкреНрд░рд┐рдВрдЯ рдХрд┐рдпрд╛

рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓

import errorHandler from '../../controller/errorHandler'

describe('auth test', () => {
  describe('test error: ', () => {
    const test1 = jest.spyOn(errorHandler, 'handleClientError')
    test('should return 400', (done) => {
      request(app)
      .post('/auth/error')
      .then((res) => {
        expect(res.statusCode).toBe(400)
        expect(test1).toBeCalled()
        done()
      })
    })

рддреНрд░реБрдЯрд┐рд╣реИрдВрдбрд▓рд░

module.exports = {
  handleClientError () {
    console.log('err')
  }
}

рд╕рд╛рдВрддреНрд╡рдирд╛ рджреЗрдирд╛

console.log src/controller/errorHandler.js:10
      err

  тЧП auth test тА║ test error:  тА║  should return 400

    expect(jest.fn()).toBeCalled()

    Expected mock function to have been called.

      18 |         expect(res.statusCode).toBe(400)
    > 19 |         expect(test1).toBeCalled()
      20 |         done()
      21 |       })
      22 |     })

рдХреНрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ handleClientError рдпрд╛ logError ?

@WangHansen рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЖрдкрдХрд╛ рдХреЛрдб expect(errorHandler.handleClientError).toBeCalled() // > true рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

@WangHansen рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ jest.spyOn() .mockImplementation() рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ? рдЬреИрд╕реНрдореАрди рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЬреИрд╕реНрдореАрди рдХреЗ рдЬрд╛рд╕реВрд╕реЛрдВ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЯрд┐рдк рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╛рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

const mockModuleFunction = jest
  .spyOn(module, 'function')
  .mockImplementation(() => 'hello');
...
expect(mockModuleFunction.mock).toBeCalled();

рдпрджрд┐ рдЖрдк mockImplementation() , рддреЛ jest.spyOn() рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ _not_ рдПрдХ рдирдХрд▓реА (afaiu) рд╣реИ рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдЦрдирд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ

const moduleFunction = module.function;
jest.spyOn(module, 'function').mockImplementation(moduleFunction);
...

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ _ рдЪрд╛рд╣рд┐рдП_ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореВрд▓ рдЕрдиреБрд░реЛрдз рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ...

рдХреНрдпрд╛ рдЖрдк рд╕рд┐рд░реНрдл рдПрдХ рдЖрдпрд╛рдд * рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд▓рдкреЗрдЯ рдирд╣реАрдВ рд╕рдХрддреЗ рдереЗ? рдЬреИрд╕реЗ

рдЖрдпрд╛рдд * './myfile.js' рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ;

рдХреЙрдиреНрд╕реНрдЯ рд╣реИрдВрдбрд▓рд░ = {
/** рдЕрд╡рд░реЛрдзрди: рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ */
рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд▓рдХреНрд╖реНрдп, рдкреНрд░реЛрдкрдХреА, рд░рд┐рд╕реАрд╡рд░) {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ( GET ${propKey} );
рд╡рд╛рдкрд╕реА 123;
},

/** Intercepts: checking whether properties exist */
has(target, propKey) {
    console.log(`HAS ${propKey}`);
    return true;
}};

рдХрд╛рд╕реНрдЯ рдкреА = рдирдпрд╛ рдкреНрд░реЙрдХреНрд╕реА (рдкрд░реАрдХреНрд╖рдг);

рдордВрдЧрд▓рд╡рд╛рд░, 30 рдЬрдирд╡рд░реА, 2018 рдХреЛ рд╢рд╛рдо 4:24 рдмрдЬреЗ, рдбреЗрдирд┐рд╕ рд▓реЙрдЧрд┐рдиреЛрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@WangHansen https://github.com/wanghansen рдХреНрдпрд╛ рдЖрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
.mockImplementation () рдЖрдкрдХреЗ jest.spyOn () рдХреЗ рд▓рд┐рдП? рдЬреИрд╕реЗ рдХреЛрдИ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ
рдЬреИрд╕реНрдореАрди, рдореИрдВрдиреЗ рдЗрд╕ рдЯрд┐рдк рдХреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╛рдпрд╛:
рдЬреИрд╕реНрдореАрди рдХреЗ рдЬрд╛рд╕реВрд╕ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

рдХреЙрдиреНрд╕реНрдЯ рдореЙрдХрдореЙрдбреНрдпреВрд▓ рдлрдВрдХреНрд╢рди = рдЬреЗрд╕реНрдЯ
.spyOn (рдореЙрдбреНрдпреВрд▓, 'рдлрд╝рдВрдХреНрд╢рди')
.mockImplementation(() => 'hello');...expect(mockModuleFunction.mock).toBeCalled();

рдпрджрд┐ рдЖрдк mockImplementation() рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ jest.spyOn() рдПрдХ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ
рд╡рд╣ рд╡рд╕реНрддреБ рдЬреЛ рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ (afaiu) рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдпрджрд┐ рдЖрдкрдХреЛ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдЦрдирд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рд╣реИ
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд▓рд╛рдпрдХ

рдХреЙрдиреНрд╕реНрдЯ рдореЙрдбреНрдпреВрд▓рдлрдВрдХреНрд╢рди = рдореЙрдбреНрдпреВрд▓.рдлрдВрдХреНрд╢рди; рдЬреЗрд╕реНрдЯред рд╕реНрдкрд╛рдИрдСрди (рдореЙрдбреНрдпреВрд▓, 'рдлрдВрдХреНрд╢рди')ред рдореЙрдХ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди (рдореЙрдбреНрдпреВрд▓рдлрдВрдХреНрд╢рди); ...

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/jest/issues/936#issuecomment-361648414 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AQRY9VXyHNYatwOOY6EV637WGQH9k5Plks5tP0I9gaJpZM4IPGAH
.

--

рдбреИрд░реЗрди рдХреНрд░реЗрд╕рд╡реЗрд▓
рдЕрдиреБрдмрдВрдз рдбреЗрд╡рд▓рдкрд░ | рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб
рдИ-рдореЗрд▓: [email protected]
рдлрд╝реЛрди:
рд╡реЗрдмрд╕рд╛рдЗрдЯ: http://www.develer.co.uk

рдпрд╣ рдИ - рдореЗрд▓ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
рдЪреЗрддрд╛рд╡рдиреА: рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд╛рдпрд░рд╕ рдИрдореЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛
рд╡рд╛рдпрд░рд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдИрдореЗрд▓ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреБрд▓рдЧреНрдирдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб рдХрд┐рд╕реА рднреА рд╡рд╛рдпрд░рд╕ рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджрд╛рдпрд┐рддреНрд╡ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рдИрдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рддред рдИ-рдореЗрд▓ рд╕рдВрдЪрд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА
рд╕реБрд░рдХреНрд╖рд┐рдд рдпрд╛ рддреНрд░реБрдЯрд┐ рдореБрдХреНрдд рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦреЛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рджреЗрд░ рд╕реЗ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рд╡рд╛рдпрд░рд╕ рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░реЗрд╖рдХ
рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдпрд╛ рдЪреВрдХ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА, рдЬреЛ рдИ-рдореЗрд▓ рд╕рдВрдЪрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред

рдЪреЗрддрд╛рд╡рдиреА: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддреА рд╣реИ
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рдИрдореЗрд▓ рдореЗрдВ рдХреЛрдИ рд╡рд╛рдпрд░рд╕ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдХрдВрдкрдиреА рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА
рдЗрд╕ рдИрдореЗрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдиреБрдХрд╕рд╛рди рдпрд╛ рдХреНрд╖рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдпрд╛
рд╕рдВрд▓рдЧреНрдирдХред

рдбреЗрд╡реЗрд▓рд░ рд▓рд┐рдорд┐рдЯреЗрдб рдЗрдВрдЧреНрд▓реИрдВрдб рдФрд░ рд╡реЗрд▓реНрд╕ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдПрдХ рд▓рд┐рдорд┐рдЯреЗрдб рдХрдВрдкрдиреА рд╣реИред |
рдХрдВрдкрдиреА рдкрдВрдЬреАрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ 09817616 | рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдпрд╛рд▓рдп: SUITE 1 SECOND
рдлреНрд▓реЛрд░ рдПрд╡рд░рдбреАрди рд╣рд╛рдЙрд╕, рдбреЗрдирд╕реНрд▓реА рд░реЛрдб, рдмреЛрд░реНрдирдорд╛рдЙрде, рдпреВрдирд╛рдЗрдЯреЗрдб рдХрд┐рдВрдЧрдбрдо, BH7 7DU

@dinvlad @iampeterbanjo @SimenB рдЖрдкрдХреА рд╕рднреА рдорджрдж рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ next(err) рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐, рдЬрдм рдХреЛрдИ рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ errorHandler рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ return next(err) рдореЗрдВ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдВрдиреЗ console.log рдЬреЛрдбрд╝рд╛, рддреЛ рдпрд╣ рдкреНрд░рд┐рдВрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

@dinvlad рдореИрдВрдиреЗ рдЖрдкрдХреА рд╡рд┐рдзрд┐ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдмрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЛ mockImplementation рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдиреБрд╕рд╛рд░ jest.spyOn , рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@WangHansen рд╣рд╛рдБ рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рддрднреА рд╣реЛрддреА рд╣реИ рдЬрдм рдХреЛрдИ рдореВрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдореИрдВ рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдЪрд╛рд░ рдлреЗрдВрдХ рд░рд╣рд╛ рдерд╛ред

рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреА рд╡рд┐рдзрд┐ рдХреЙрд▓рдмреИрдХ рдФрд░/рдпрд╛ рд╡рд╛рджреЗ (рдпрд╛ async/рдкреНрд░рддреАрдХреНрд╖рд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреА рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ expect.assertions(N) рд╣реИред рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЙрд▓рдмреИрдХ/рд╡рд╛рджреЛрдВ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, https://facebook.github.io/jest/docs/en/asynchronous.html

рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ fns рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реБрдП @seibelj рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ impl рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдбрд┐рдЧреНрд░реА рддрдХ рдирд╣реАрдВ)

рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдордЬрд╛рдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

рдирдорд╕реНрддреЗ,
рдкреВрд░реА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реА рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдирд╛ - рдореИрдВ рдЕрднреА рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реВрдВред
@greypants рдХрд╛ рдЖрд╢рд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдореВрд▓ рдХрд╛рд░реНрдп рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рд╕реЗ рдХреБрдЫ рдмрджрд▓рд╛ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?

рдореИрдВрдиреЗ @greypants рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

import Module from './module'
import { getJSON } from './helpers'

jest.mock('./helpers', () =>
  Object.assign(require.requireActual('./helpers'), {
    getJSON: jest.fn()
  })
)

test('should use the mock', async () => {
  getJSON.mockResolvedValue('foo')
  await expect(module().someAsyncThingThatUsesGetJSON()).resolves.toEqual('foo')
})

test('should use the actual module', () => {
  expect(module().someFunctionThatUsesAHelper()).toBe(true)
})

рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝реЗ рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рдереЗред рдореИрдВ рдЬреЗрд╕реНрдЯ рдФрд░ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ" рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@sarahdayan , рдФрд░ рдЬреЛ рднреА рдмреНрдпрд╛рдЬ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ -
рдореИрдВрдиреЗ рдмреЗрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрд╛, рд▓реЗрдХрд┐рди 'рдПрдХ рд╕рдорд╛рдзрд╛рди рдкрд░реНрдпрд╛рдкреНрдд рд╕реБрд╕рдВрдЧрдд рдерд╛ рдЬреЛ рд╣реИрдХреА рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЧреНрд▓реЛрдмрд▓ рдЬреЗрд╕реНрдЯ рдХреЗ рдореЙрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ genMockFromModule рдФрд░ requireActual рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

//  __mocks__/myModule.js
const moduleMock = jest.genMockFromModule('./../myModule');

// in most cases we don't want to mock `someFunction`
moduleMock.someFunction = jest.fn(
  (...args) => require.requireActual('./../myModule').someFunction(...args)
)

module.exports = moduleMock;

рдпрд╣ рд╕рдорд╛рдзрд╛рди рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, someFunction рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬрдм рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ mockImplementationOnce рдпрд╛ mockImplementation рд╕рд╛рде mockImplementationOnce someFunction рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореЙрдХ рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред mockImplementation рдПрдкреАрдЖрдИред

рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╡рд╛рд░реНрддрд╛рд▓рд╛рдкреЛрдВ рдХреЛ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ, рддреЛ рдЙрддреНрддрд░ рдмреИрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рд╣реИ , рдпрд╣ рдкреНрд▓рдЧрдЗрди рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдХреА рдереАред
рдХреГрдкрдпрд╛ рдЙрд╕ рдкрд░рд┐рд╡рд╛рдж рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЖрдк рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВрдЧреЗред

рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  1. рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ m рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ f , g рдФрд░ h рдЬрд╣рд╛рдВ g рдФрд░ h рдХреЙрд▓ f ред рд╣рдо f рдХрд╛ рдЙрдкрд╣рд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ g рдФрд░ h рдЕрд╕рд▓реА f рдмрдЬрд╛рдп рдирдХрд▓реА рдХреЙрд▓ рдХрд░реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рд╕реАрдзреЗ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ f рдХреЛ рд╣рдореЗрд╢рд╛ exports рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ cpojer рдиреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ ред рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рдЖрдкрдХрд╛ рдореЙрдбреНрдпреВрд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ ES6 рдЖрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреИрдмреЗрд▓ рдореЗрдВ рднреА рд╕рдЪ рд╣реИ)ред
  2. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо f рдХреЛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ m2 ред рдлрд┐рд░ m import {f} from 'm2' рдЬреИрд╕рд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрдЧрд╛ рдФрд░ рдЬрдм g рдФрд░ h рдХреЙрд▓ f , рддреЛ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ m2.f рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ m2 = require('./m2') (рдмреЗрдмреЗрд▓/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрд╡рд╛рдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛)ред рдпрд╣ f рдордЬрд╝рдмреВрддреА рд╕реЗ рдордЬрд╛рдХ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЧреНрд░реЗрдкреИрдВрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдк рдХреЙрд▓ рдХреЛ рдордЬрд╝рдмреВрддреА рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдореЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ ред рдиреЛрдЯ: рдЧреНрд░реЗрдкреИрдВрдЯреНрд╕ рд╕рдорд╛рдзрд╛рди рдЕрдм рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ: " jest.mock() рдореЙрдбреНрдпреВрд▓ рдлрд╝реИрдХреНрдЯрд░реА рдХреЛ рдХрд┐рд╕реА рднреА рдЖрдЙрдЯ-рдСрдл-рд╕реНрдХреЛрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ - рдЕрдорд╛рдиреНрдп рд╡реИрд░рд┐рдПрдмрд▓ рдПрдХреНрд╕реЗрд╕: __рдЕрд╕рд╛рдЗрди"ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ; рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, Object.assign рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  3. рд▓реЗрдХрд┐рди рдЕрдЧрд░, рдПрдХ рдпрд╛ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдпрд╛ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рд░ рдЪреАрдЬ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдбрд╛рд░реНрдХреЛрд╡рд┐рдХ рдЬреИрд╕реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

(2) рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

~~~ рдЬреЗрдПрд╕
// рдореЙрдбреНрдпреВрд▓ m.js
рдЖрдпрд╛рдд {f} './m2' рд╕реЗ
рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ рдЬреА () {рд╡рд╛рдкрд╕реА 'рдПрдл рд▓реМрдЯрд╛' + рдПрдл (); };

// рдореЙрдбреНрдпреВрд▓ m2.js
рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ рдПрдл () {рд╡рд╛рдкрд╕реА 'рдЕрд╕рд▓реА рдПрдл'; }

// test.js
рдЖрдпрд╛рдд * './m' рд╕реЗ m рдХреЗ рд░реВрдк рдореЗрдВ

jest.mock('./m2', () => Object.assign(
рдЖрд╡рд╢реНрдпрдХрддрд╛ред рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ ('./m2'), {
f: jest.fn().mockReturnValue('MOCK')
}));

рдкрд░реАрдХреНрд╖рдг ('рдордЬрд╛рдХ', () => {
рдЙрдореНрдореАрдж (рдорд┐рд▓реАрдЧреНрд░рд╛рдо ())ред toEqual ('f MOCK рд▓реМрдЯрд╛');
});
~~~

рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдореИрдВ #2649 рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛: рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ jest.mock рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ unmock рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рджред

рдзрдиреНрдпрд╡рд╛рдж!! @sarahdayan
рдХреБрдЫ рд╕рдордп рд╕реЗ рдЗрд╕рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рдереЗ

рдпрджрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рдХрдореА рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдХрд╛ рд╣рдореЗрд╢рд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ!

рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдЗрдзрд░-рдЙрдзрд░ рдЦреЗрд▓рд╛ рдФрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЪрд╛рд░ рдерд╛:

  • рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирдХрд▓реА, рд▓реЗрдХрд┐рди рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдореВрд▓ рдореЙрдбреНрдпреВрд▓ рд╣реЛрддрд╛ рд╣реИред
  • рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЧреБрдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ (рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдЧреБрдгреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдЧрд╛)
  • рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЧреБрдгреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рднреА рдкреНрд░рджрд╛рди рдХрд░реЗрдВ (рдлрд┐рд░ рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред
// m1.js
export const f = () => "original f"

// __mocks__/m1.js
const originalM1 = require.requireActual("../m1");
// set the original as a prototype
let mockModule: any = Object.create(originalM1);
const __setMock = (name, value) => {
  mockModule[name] = value;
};
const __removeMock = (name) => {
  Reflect.deleteProperty(mockModule, name);
};
// enhance the mocked module to allow overriding original exports
module.exports = Object.assign(mockModule, { __setMock, __removeMock });


// m1.test.js
import { f } from "./m1";

jest.mock("./m1");

test("mocking stuff", () => {
  // here nothing is mocked - the original module is used
  expect(f()).toBe("original f");

  // override the export f of the module
  require("./m1").__setMock("f", () => "mocked f");
  expect(f()).toBe("mocked f");

  // set it back to the original
  require("./m1").__removeMock("f");
  expect(f()).toBe("original f");

  //override with another value
  require("./m1").__setMock("f", () => "another mocked f");
  expect(f()).toBe("another mocked f");
});

рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ:

рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ (рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдирд╣реАрдВ) рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рдпрд╣ рд╣реИ (jest 23):

// importedModule.js
export const funcB = () => {
  return "not mocked";
};
export const funcA = () => {
  return mockProxy.funcB(); // this works but it's soooo hacky
};

export const mockProxy = {
  funcB
};

// moduleToTest.js
import { funcA } from "./moduleImported.js";

export default function() {
  return funcA();
}

// test
let moduleImported = require("./moduleImported.js");
moduleImported.mockProxy.funcB = jest.fn(() => "mocked");
const funcToTest = require("./moduleToTest.js").default; // or import

it("should return mocked", function() {
  expect(funcToTest()).toBe("mocked");
});

рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐:

  • test.js importedModule.js . рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИ
  • рд╕рдорд╛рдзрд╛рди рдХрдордЬреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ mockProxy рдХреЛ рджреЗрдЦрдХрд░ importedModule.js

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

"jest": "^21.2.1",
"jest-cli": "^21.2.1",

@jamesone рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ https://github.com/facebook/jest/issues/936#issuecomment -410080252 рдкрдврд╝рд╛ рд╣реИ?

@thomaskempel рдХреЗ рдЙрддреНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕реЗ 'рд╕рд╛рдЭрд╛-рдШрдЯрдХ' рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХрдИ рдирд╛рдорд┐рдд рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрди рдирд╛рдорд┐рдд рдирд┐рд░реНрдпрд╛рддреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЬреЛрдбрд╝реЗ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдмрд╛рдХреА рдХреЛ рдЕрд╕рд▓реА рдЪреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рддреЛ __mocks__/shared-components.js рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ:

const original = require.requireActual('shared-components');

module.exports = {
...original,
moduleNameToOverride: jest.fn().mockImplementation(() => {
      return 'whatever';
    }),
}

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЛрдХ рд░рд╣рд╛ рдерд╛ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдиреЗ рдореБрдЭреЗ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХреА рдФрд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЛ рдпрд╣рд╛рдБ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ https://medium.com/@DavideRama/mock -spy-exported-functions-within-a-single- рдореЙрдбреНрдпреВрд▓-рдЗрди-рдЬреЗрд╕реНрдЯ-cdf2b61af642

@qwertie рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдкреНрд░реЗрд░рд┐рдд

mockGet = jest.fn()
jest.mock('my-module', () => ({
  ...jest.requireActual('my-module'),
  get: mockGet
}))

@MajorBreakfast рдЬреЛ React.lazy рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

const mockLazy = jest.fn();

jest.mock('React', () => ({
    ...jest.requireActual('React'),
    lazy: mockLazy
}));

рдореБрдЭреЗ рдЕрднреА рднреА ReferenceError: React is not defined ред

рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рд░реНрдпрд╛рдд рдлрд╝рдВрдХреНрд╢рди рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдлрд╝рдВрдХреНрд╢рди рднрд╛рдЧ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг:
рдбреЗрдЯрд╛рджрд╛рдУ.рдЬреЗрдПрд╕

рдлрд╝рдВрдХреНрд╢рди рдЧреЗрдЯрдбреЗрдЯрд╛ ()
рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯрдбреЗрдЯрд╛ ()
рдлрд╝рдВрдХреНрд╢рди рд╣рдЯрд╛рдПрдВрдбреЗрдЯрд╛ ()
рдирд┐рд░реНрдпрд╛рдд {getData, setData, deleteData}

рдЕрдм рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдордХрд░рдг рджреНрд╡рд╛рд░рд╛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;

dataDao.spec.js

рдЖрдпрд╛рдд * рдбреЗрдЯрд╛рдбрд╛рдУ рдХреЗ рд░реВрдк рдореЗрдВ '../dataDao' рд╕реЗ;
// рдЖрдпрд╛рдд рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЬрд╛рд╕реВрд╕реА рдХрд░реЗрдВ
jest.spyOn (рдбреЗрдЯрд╛рдбрд╛рдУ, 'рдЧреЗрдЯрдбреЗрдЯрд╛')
jest.spyOn (рдбреЗрдЯрд╛рдбрд╛рдУ, 'рд╕реЗрдЯрдбрд╛рдЯрд╛')
jest.spyOn (рдбреЗрдЯрд╛рдбрд╛рдУ, 'рдбрд┐рд▓реАрдЯрдбреЗрдЯрд╛')

@vchinthakunta , рдЬреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд░реНрдпрд╛рдд/рдЖрдпрд╛рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдПрдХ рдкреНрд░рдореБрдЦ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдЕрдм рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдпрд╛ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ

import { justThisThing } from 'someModule';

рдХреНрдпрд╛ рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?

@MajorBreakfast рдЬреЛ React.lazy рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

const mockLazy = jest.fn();

jest.mock('React', () => ({
    ...jest.requireActual('React'),
    lazy: mockLazy
}));

рдореБрдЭреЗ рдЕрднреА рднреА ReferenceError: React is not defined ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'рд░рд┐рдПрдХреНрдЯ' рдпрд╣рд╛рдВ рд▓реЛрдЕрд░рдХреЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдпрд╛рдд рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд░рд╣рд╛ рд╣реИ?

jest.mock('react'...)

рдореБрдЭреЗ рдЕрдкрдирд╛ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЧрдП рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ require рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ default рдирд┐рд░реНрдпрд╛рдд рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣реЗрд▓реНрдкрд░реНрд╕/рдиреЗрд╡рд┐рдЧреЗрд╢рди.рдЬреЗрдПрд╕

export const initHeader = () => {
    // initialise header
    ...
}

...

export const anotherHelperFunction = () => {
    // do stuff
    ...
}

рдиреЗрд╡рд┐рдЧреЗрд╢рди.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдШрдЯрдХ

import { initHeader } from '../helpers/navigation';

jest.mock('../helpers/navigation');

...

describe('Test component', () => {

    it('should reinitialise header', () => {
        const mockHeaderInit = jest.fn();
        initHeader.mockImplementation(mockHeaderInit);

        const component = mountComponent(mockProps);
        component.simulate('click');

        expect(mockHeaderInit).toBeCalled();
    }
}
mockGet = jest.fn()
jest.mock('my-module', () => ({
  ...jest.requireActual('my-module'),
  get: mockGet
}))
ReferenceError: mockGet is not defined

       4 | const mockGet = jest.fn();
       5 | jest.mock('./browserStorage', () => ({
       6 |   ...jest.requireActual('./browserStorage'),
    >  7 |   get: mockGet,
         |        ^
       8 | }));

jest.mock рдлрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, doMock рдпрд╛

jest.mock('./browserStorage', () => ({
  ...jest.requireActual('./browserStorage'),
  get: jest.fn(),
}));

const {get: mockGet} = require('./browserStorage');

рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░реНрдпрд╛рдкреНрдд рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╣реИ?

рддреЛ, рдХреНрдпрд╛ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рдЪрд╛рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред
рдпрд╣ рдЙрджрд╛рд╣рд░рдг jsonwebtoken рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

  test('perform my test', async () => {
    // save the real jwt.verify function
    const verify = jwt.verify
    // mock it.
    jwt.verify = jest.fn().mockReturnValue({ sub: 0 })
    // do the test
    ...
    // set the real function back.
    jwt.verify = verify
  })

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рдЪрд╛рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред
рдпрд╣ рдЙрджрд╛рд╣рд░рдг jsonwebtoken рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

  test('perform my test', async () => {
    // save the real jwt.verify function
    const verify = jwt.verify
    // mock it.
    jwt.verify = jest.fn().mockReturnValue({ sub: 0 })
    // do the test
    ...
    // set the real function back.
    jwt.verify = verify
  })

рдЖрдк const verify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд╡реИрд╕реЗ рднреА, рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдкрдХрд╛ рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд┐рд░реНрдпрд╛рддрд┐рдд рдХреЙрдиреНрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ

рддреЛ, рдХреНрдпрд╛ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рднреАрддрд░ _ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдмрд╣реБрдд рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдореЙрдХ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓реЗрдЦ рд╕рднреА рд╕рдорд╛рди рд╕рд╣рдорддрд┐ рдкрд░ рдЖрдПред

https://github.com/facebook/jest/issues/936#issuecomment -438975674
https://medium.com/@qjli/how -to-mock-specific-module-function-in-jest-715e39a391f4
https://luetkemj.github.io/170421/mocking-modules-in-jest

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рднреА рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ:

_рдЙрд╕ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдореЙрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред_

рдЧрдВрднреАрд░рддрд╛ рд╕реЗред рдпрджрд┐ рдЖрдкрдХрд╛ рдореЙрдбреНрдпреВрд▓ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧреЛрдВ рдХреЛ рдЕрдиреНрдп рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдПрдХрд▓ рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░ рд░рд╣реА рд╣реИ (рд╣рд╛рдБ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЙрдбреНрдпреВрд▓ рдПрдХ рд╡рд░реНрдЧ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдХрд╛ рдПрдХ рдпреВрдирд┐рдЯ рдХрдВрдЯреЗрдирд░ рд╣реИ)ред рдЙрд╕ рдЪреВрд╕рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЙрдЫрд╛рд▓, рдЖрдк рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдирд┐рдЬреА рд░рд╛рдЬреНрдп рдХреЗ рд╕рдореВрд╣ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╡рд┐рднрд╛рдЬрд┐рдд рди рдХрд░реЗрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреАрд╕рд░рд╛ рдореЙрдбреНрдпреВрд▓ рднреА рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рд╡рд░реНрдЧ рдпрд╛ рдбреАрдЯреАрдУ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдирд┐рдЬреА рд╣реЛрдВрдЧреЗ? рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдХрд┐ рдмрд╛рд╣рд░реА рдХреЛрдб рд╕реАрдзреЗ рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЙрдХ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдзреЗ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдзреЗ рдХреЛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреБрдореНрд╣реЗрдВ рдирдпрд╛ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред

рдЬрдм рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реЛрддрд╛ рд╣реИ ...

рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдЯреЙрдордлреВрд▓рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

const tomfoolery = require('tomfoolery'); // no longer required

рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА, рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдкрд░ рдирд╣реАрдВ рд▓рд╛ рд╕рдХрддрд╛ред рдореИрдВрдиреЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ рдХрд┐ рдХреИрд╕реЗред

рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рд╡рд╣ рдХреЛрдб рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

// a.js
export const foo = () => 'foo-' + bar()
export const bar = () => 'bar'
// a.test.js
import {
  foo,
  bar
} from './a'

describe('foo', () => {
  it('should return foo-MOCKED_BAR', () => {
    expect(foo()).toBe('foo-MOCKED_BAR')
  })

  it('should have the mocked implementation of bar', () => {
    expect(bar()).toBe('MOCKED_BAR')
  })
})

describe('bar', () => {
  it('should have the original implementation of bar', () => {
    expect(bar()).toBe('bar')
  })
})

describe('foo and bar together', () => {
  it('should have the original implementation of both', () => {
    expect(foo()).toBe('foo-bar')
  })
})

рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ lodash.random рдЬреИрд╕реА рдПрдХрд▓ рд▓реЙрд╢ рд╡рд┐рдзрд┐ рдХрд╛ рдХреЗрд╡рд▓ рдЙрдкрд╣рд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕

const lodash = require('lodash');

module.exports = function() {
  return lodash.random();
}

рдЯреЗрд╕реНрдЯ.рдЬреЗрдПрд╕

const lodash = require('lodash');
const module = require('./module.js);

it('mocks lodash', () => {
    jest.spyOn(lodash, 'random').mockImplementationOnce(() => {
      return 2;
    });

    expect(module()).toEqual(2)
});

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗ :)

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рдорд╛рд░реА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдЪреАрдЬ рдереА const рдЬрд┐рд╕реЗ рд╣рдо рд╕реАрдзреЗ рдлрдВрдХреНрд╢рди рдХреЛ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛:
export function doSomething(a, b) {}
рдХрд╛рдо рдореЗрдВ рд╣реЛ:
export const doSomething = function (a, b) {}

рдореИрдВрдиреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬреИрд╕реЗ @arbielsk рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рджреЛ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ...

@dgrcode рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХрднреА рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╣рд▓ рдорд┐рд▓рд╛? рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдЖрдк рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЬреЗрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордЬрд╛рдХ рдХрд░рдХреЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рд░реНрдл рдордЬрд╛рдХ рдХрд░рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░реА рджреГрд╢реНрдп рдирдХрд▓реА рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, foo рдФрд░ bar рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП foo рдХреЗ bar рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рдХрд▓реНрдк рдпрд╛ рддреЛ рд╣реИрдВ:
1) рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ foo рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░реЗ рдЬрд┐рд╕рдореЗрдВ bar
2) рдмреЗрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ!

рдореБрдЭреЗ рдереЛрдбрд╝реА рдЕрд▓рдЧ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА: рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкреВрд░реНрдг рдореЙрдбреНрдпреВрд▓ _except_ рдХрд╛ рдирдХрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ @MajorBreakfast рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ

jest.mock('my-module', () => ({
  ...jest.genMockFromModule('my-module'),
  myFunction: jest.requireActual('my-module').myFunction
}))

@dgrcode рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХрднреА рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╣рд▓ рдорд┐рд▓рд╛? рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдЖрдк рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЬреЗрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордЬрд╛рдХ рдХрд░рдХреЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ _рдерд┐рдВрдХ_ рдХрд┐ рдордЬрд╛рдХ рдХрд░рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░реА рджреГрд╢реНрдп рдирдХрд▓реА рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, foo рдФрд░ bar рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП foo рдХреЗ bar рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рдХрд▓реНрдк рдпрд╛ рддреЛ рд╣реИрдВ:

  1. рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ foo рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░реЗ рдЬрд┐рд╕рдореЗрдВ bar
  2. рдмреЗрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ!

рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рдерд╛
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдХреИрд╕реЗ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреА рдореЗрд░реА рд╕рдордЭ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЧрдИ рдереА тАНтЩВ

рдореВрд▓ рд░реВрдк рд╕реЗ
рдпрджрд┐ 2 рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реИрдВ, рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдЕрдЧрд░ foo рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ bar

function bar() {
  return 'some-result'
}

function foo(){
  return bar()  // <-- the function I want to mock 
}

рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ bar рдбрд╛рд▓реЗрдВ (рдордЬрд╛рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)

рдореИрдВрдиреЗ bar рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдЕрдм рдореИрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛
рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ @yoni-abtech рдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж

рдЗрд╕ рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдмрд╛рд░-рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╡рд╣рд╛рдВ 3 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ ....

рд╡рд┐рдХрд▓реНрдк 1 - const рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ

рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, func-style рдПрд╕реНрд▓рд┐рдВрдЯ рдирд┐рдпрдо рдХреЛ рдЖрдкрдХреА рдкреАрда рдорд┐рд▓ рдЧрдИ рд╣реИред

export const рдХрд░рдиреЗ рд╕реЗ рдЖрдк spyOn рдлрд╝рдВрдХреНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ _same_ рдореЙрдбреНрдпреВрд▓ рдХреЗ рднреАрддрд░ рд╕реЗ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

// hello.js
export const message = () => {
  return 'Hello world';
}

export const foo = () => {
  return message();
}
// hello.test.js
import * as testModule from './hello.js';

describe('test spyon with function expressions', function () {
  afterAll(() => {
    jest.restoreAllMocks();
  });
  it('should NOT mock message in foo', function () {
    const actual = testModule.foo();

    expect(actual).toBe('Hello world');
  });

  it('should mock message in foo', function () {
    jest.spyOn(testModule, 'message').mockReturnValue('my message');

    const actual = testModule.foo();

    expect(actual).toBe('my message');
    expect(testModule.message).toHaveBeenCalledTimes(1);
  });
});

рд╡рд┐рдХрд▓реНрдк 2 - rewire рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (рдпрд╛рдиреА const рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЖрдкрдХреЛ рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рд╕реЗ _rewire_ (рдЙрд░реНрдл рдирдХрд▓реА) рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдХреЛрдб рдиреАрдЪреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд░реАрд╡рд╛рдпрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рднреА рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, message рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдмрд┐рдирд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг:

// hello.js
export function message() {
  return 'Hello world';
}

export function foo() {
  return message();
}
// hello.test.js
import * as testModule from './hello.js';

describe('test rewire api', function() {
  it('should NOT mock message in foo', function () {
    const actual = testModule.foo();

    expect(actual).toBe('Hello world');
  });

  it('should mock message in foo', function () {
    testModule.__RewireAPI__.__Rewire__('message', jest.fn().mockReturnValue('my message'));

    const actual = testModule.foo();

    expect(actual).toBe('my message');
    expect(testModule.message).toHaveBeenCalledTimes(1);
    testModule.__RewireAPI__.__ResetDependency__('message');
  });
});

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВред

рдиреЛрдЯ: рдмреЗрдмреЗрд▓ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд╡рд┐рдХрд▓реНрдк 3 - рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓/рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░реЗрдВ

рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрдо рд╕реЗ рдХрдо рдЕрдиреБрдХреВрд▓ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ mock рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


рдкреБрдирд╢реНрдЪ: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЪрд▓рдирд╛ рдмрд╣реБрдд рдЬреНрдЮрд╛рдирд╡рд░реНрдзрдХ рдФрд░ рдЕрдХреНрд╕рд░ рдордиреЛрд░рдВрдЬрдХ рдерд╛, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рд░рд╛рдВрд╢ рджреВрд╕рд░реЛрдВ рдХреЛ рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред я╕П

рдзрдиреНрдпрд╡рд╛рдж @nickofthyme , рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдореЗрд░рд╛ рд╕рд┐рд░ рдкреАрдЯрдиреЗ рдХреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХрд╛ рдЕрдВрдд рдХрд┐рдпрд╛ред

@nickofthyme рдЖрдкрдХрд╛ option 1 рдореЗрд░реЗ рдРрдк рдФрд░ create react app рджреЛрдиреЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

 FAIL  src/hello.test.js
  test spyon with function expressions
    тЬУ should NOT mock message in foo (3ms)
    тЬХ should mock message in foo (6ms)

  тЧП test spyon with function expressions тА║ should mock message in foo

    expect(received).toBe(expected) // Object.is equality

    Expected: "my message"
    Received: "Hello world"

      17 |     const actual = testModule.foo();
      18 |
    > 19 |     expect(actual).toBe("my message");
         |                    ^
      20 |     expect(testModule.message).toHaveBeenCalledTimes(1);
      21 |   });
      22 | });

      at Object.toBe (src/hello.test.js:19:20)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 passed, 2 total
Snapshots:   0 total
Time:        1.848s
Ran all test suites related to changed files.

@danielhusar рдЖрдк рд╕рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рд╕реАрдЖрд░рдП рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк 1 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореЙрдХрд┐рдВрдЧ рдорд┐рд▓реАред yarn test:hello рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред

рдирддреАрдЬрд╛

> yarn test:hello
yarn run v1.16.0
$ jest --config=jest.config.js -t=hello --verbose
 PASS  src/hello/hello.test.ts
  test hello
    тЬУ should NOT mock message in foo (3ms)
    тЬУ should mock message in foo (1ms)

Test Suites: 1 skipped, 1 passed, 1 of 2 total
Tests:       1 skipped, 2 passed, 3 total
Snapshots:   0 total
Time:        1.392s
Ran all test suites with tests matching "hello".
тЬи  Done in 2.36s.

рдпрд╣ рдПрдХ рдХрд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ jest.config.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдлрд╝рд╛рдЗрд▓ ts-jest рдФрд░ рдмреБрд▓рд╛ jest --config=./jest.config.js рд╕реАрдзреЗ, рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ react-scripts ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ react-scripts рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕реБрдзрд╛рд░ *.css рдФрд░ *.svg рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕реНрдлрд╝реЙрд░реНрдо рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП App.tsx рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВред

рдХреНрдпрд╛ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реБрдВрджрд░ рдорд╛рдирдХ рд╕реЗрдЯрдЕрдк рд╣реИ (рдЯреАрдПрд╕ рдХреЗ рдмрд┐рдирд╛) рдФрд░ рдпрд╣ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдЖрдЬ рд░рд╛рдд рдереЛрдбрд╝рд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@danielhusar рдореИрдВрдиреЗ рдХрд▓ рд░рд╛рдд рджреЗрдЦрд╛ рдФрд░ рдмреЙрдХреНрд╕ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓ рд╕рдХрд╛ред рдХреБрдВрдЬреА рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд┐рдЧ transformer рдЬрд┐рд╕реЗ CRA рдЖрдкрдХреЛ package.json#jest рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред Js рдФрд░ ts рдлрд╝рд╛рдЗрд▓реЗрдВ babel-jest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХреА рдЬрд╛рддреА рд╣реИрдВ рд▓реЗрдХрд┐рди react-scripts рдЖрдкрдХреЛ .babelrc рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ test env рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗ react-scripts test рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдпрд╣рд╛рдБ ред

рдХрд╛рд╢ рдореИрдВ рдФрд░ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░ рдкрд╛рддрд╛ рд▓реЗрдХрд┐рди рдЕрднреА рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдордп рдирд╣реАрдВ рд╣реИред

рд╣рдореНрдо рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдореЗрд░реЗ рдХрд╕реНрдЯрдо рд╕реЗрдЯрдЕрдк рдкрд░, рдХреНрд░реЗ рдирд╣реАрдВ)ред
(рдЬреЗрд╕реНрдЯ рдФрд░ рдмреЗрдмреЗрд▓-рдЬреЗрд╕реНрдЯ рджреЛрдиреЛрдВ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг)

рдпрд╣ рдореЗрд░рд╛ рдордЬрд╝рд╛рдХ config рд╣реИ:

module.exports = {
  name: 'my-app',
  testURL: 'http://localhost/',
  setupFiles: ['<rootDir>/setup-jest.js'],
  setupFilesAfterEnv: ['<rootDir>/setup-test.js'],
  testMatch: ['**/__tests__/**/*.test.js?(x)', '**/?(*.)+(spec|test).js?(x)'],
  testEnvironment: 'jest-environment-jsdom-fifteen',
  snapshotSerializers: ['enzyme-to-json/serializer'],
  globals: {
    ENV: 'test',
  },
  transform: {
    '^.+\\.[t|j]sx?$': 'babel-jest',
  },
};

рдФрд░ рдореЗрд░рд╛ рдмреЗрдмрд▓рд░реНрдХ:

{
  "presets": [
    "@babel/react",
    ["@babel/env", {
      "corejs": "3",
      "useBuiltIns": "entry",
      "loose": true,
      "exclude": [
        "es.string.split"
      ]
    }],
    "@babel/flow"
  ],
  "plugins": [
    "array-includes",
    "lodash",
    "@babel/plugin-syntax-dynamic-import",
    "@babel/plugin-syntax-class-properties",
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-proposal-object-rest-spread",
    "@babel/plugin-proposal-optional-chaining"
  ],
  "env": {
    "test": {
      "plugins": ["dynamic-import-node"]
    }
  }
}

рд╡рд┐рдХрд▓реНрдк 1 рд╕реЗ рдЬреВрдЭ рд░рд╣реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, () => (expression) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп () => { return expression } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк 1 рдорд┐рд▓рд╛:

import * as test from './test';

export const message = () => {
    return 'Hello world';
  }

  export const foo = () => {
    return test.message();
  }

рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@nickofthyme , рд╡рд┐рдХрд▓реНрдк 1 рд╕рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХреЛрдб рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:

const foo = () => {}
export { foo }

рдлрд┐рд░ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд▓реЛрдХрдиред рдзрдиреНрдпрд╡рд╛рдж @maletor

рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╣ ES рдЖрдпрд╛рдд рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ Node рдХреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
https://jestjs.io/docs/hi/jest-object#jestrequireactualmodulename

@johncmunson рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЖрдкрдиреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рддреЗ рд╣реБрдП рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдХреЗрд╡рд▓ jest.mock _once_ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдирдХрд▓реА рд╡рд┐рдзрд┐ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд┐рд░реНрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рдКрдкрд░ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ...рдореИрдВрдиреЗ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП bar рдЬреЛрдбрд╝рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреИрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ foo рдФрд░ bar рдмреАрдЪ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдирдХрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

export const message = (): string => {
  return 'Hello world';
}

export const foo = (): string => {
  return message();
}

export const bar = (): (() => string) => {
  return foo;
}

jest.mock рд╕рд╛рде jest.requireActual рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛ред

import * as mockTestModule from './hello';

jest.mock('./hello');
const actualTestModule = jest.requireActual('./hello');

describe('test hello', function () {
  afterAll(() => {
    jest.restoreAllMocks();
  });

  // first test doesn't depend on any other method of the module so no mocks
  it('should NOT mock message in foo', function () {
    const actual = actualTestModule.foo();

    expect(actual).toBe('Hello world');
  });

  // the second I want to mock message in foo
  it('should mock message in foo', function () {
    jest.spyOn(mockTestModule, 'message').mockReturnValue('my message');
    const actual = actualTestModule.foo();

    expect(actual).toBe('my message'); // fails
    expect(mockTestModule.message).toHaveBeenCalledTimes(1); // never called
  });

  it('should mock foo in bar', function () {
    jest.spyOn(mockTestModule, 'foo').mockReturnValue('my message');
    const actual = actualTestModule.bar();

    expect(actual()).toBe('my message'); // fails
    expect(mockTestModule.message).toHaveBeenCalledTimes(1); // never called
  });
});

рдореИрдВрдиреЗ jest.doMock рд╕рд╛рде рдЙрдирдХрд╛ рдЕрд▓рдЧ рд╕реЗ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдлрд┐рд░ рднреА рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред


рдХреЛрдб рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

```ts
рдЖрдпрд╛рдд * './hello' рд╕реЗ testModule рдХреЗ рд░реВрдк рдореЗрдВ;

рд╡рд░реНрдгрди рдХрд░реЗрдВ ('рд╣реИрд▓реЛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ', рдлрд╝рдВрдХреНрд╢рди () {
рдмрд╛рдж рдореЗрдВ (() => {
jest.restoreAllMocks ();
});

it('should NOT mock message in foo', function () {
  const actual = testModule.foo();

  expect(actual).toBe('Hello world');
});

it('should mock message in foo', function () {
  jest.doMock('./hello', () => {
    // Require the original module to not be mocked...
    const originalModule = jest.requireActual('./hello');

    return {
      ...originalModule,
      message: jest.fn().mockReturnValue('my message'),
    };
  });
  const actual = testModule.foo();

  expect(actual).toBe('my message'); // fails
  expect(testModule.message).toHaveBeenCalledTimes(1); // never called
});

it('should mock foo in bar', function () {
  jest.doMock('./hello', () => {
    // Require the original module to not be mocked...
    const originalModule = jest.requireActual('./hello');

    return {
      ...originalModule,
      foo: jest.fn().mockReturnValue('my message'),
    };
  });
  const actual = testModule.bar()();

  expect(actual).toBe('my message'); // fails
  expect(testModule.foo).toHaveBeenCalledTimes(1); // never called
});

});
```

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ foo рдХреЙрд▓ рдХрд░рдирд╛ рдХрд╣реЗрдВ, рдлрд┐рд░ рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ message рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдирдХрд▓реА рдирд╣реАрдВ ред

рдХрд╛рд╢ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд▓реЗрдХрд┐рди рдЬреЛ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред рдореИрдВ рд╕рд╣рд░реНрд╖ рдЧрд▓рддреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрд╕ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рдХреЙрдиреНрд╕реНрдЯ/рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

function mockFunctions() {
  const original = require.requireActual('../myModule');
  return {
    ...original, //Pass down all the exported objects
    test: jest.fn(() => {console.log('I didnt call the original')}),
    someFnIWantToCurry: {console.log('I will curry the original') return jest.fn((...args) => original.someFnIWantToCurry(...args)}),
  }
jest.mock('../myModule', () => mockFunctions());
const storage = require.requireMock('../myModule');
`

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдереЛрдбрд╝рд╛ рдЫреЛрдЯрд╛ рд╣реИ:

const module = require('./module');
jest.spyOn(module, 'myFn').mockImplementation(() => 'val');

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдХреЗрд╡рд▓ import рдмрдЬрд╛рдп require :

import * as module from './module';

рдпрд╣ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдореЙрдХ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИред

рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрд╕ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рдХреЙрдиреНрд╕реНрдЯ/рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

function mockFunctions() {
  const original = require.requireActual('../myModule');
  return {
    ...original, //Pass down all the exported objects
    test: jest.fn(() => {console.log('I didnt call the original')}),
    someFnIWantToCurry: {console.log('I will curry the original') return jest.fn((...args) => original.someFnIWantToCurry(...args)}),
  }
jest.mock('../myModule', () => mockFunctions());
const storage = require.requireMock('../myModule');
`

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдереЛрдбрд╝рд╛ рдЫреЛрдЯрд╛ рд╣реИ:

const module = require('./module');
jest.spyOn(module, 'myFn').mockImplementation(() => 'val');

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдХреЗрд╡рд▓ import рдмрдЬрд╛рдп require :

import * as module from './module';

рдпрд╣ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдореЙрдХ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИред

рдУрд╣, рд╣рд╛рдБ рдпрд╣ рд╡рд┐рдзрд┐ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИ рдпрджрд┐ рдЖрдкрдХреА рд╡рд╕реНрддреБ рдореЗрдВ рдХреЗрд╡рд▓ getter рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдиреАрдЪреЗ рдЬреИрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

Test suite failed to run

    TypeError: Cannot set property useContent of #<Object> which has only a getter

рд╢рд╛рдпрдж рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП jest.mock(..) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред : рдЭреБрдХрд╛ рд╣реБрдЖ рдЖрджрдореА:

рдореЗрд░реЗ рдореЛрдХреНрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

import { unsubscribe } from "../lib/my-lib"
import { MyComponent } from "./index"

test("unsubscribe gets called", () => {
    const module = require("../lib/my-lib")
    jest.spyOn(
        module,
        "unsubscribe"
    ).mockImplementation(() => jest.fn())

    const { getByTestId } = render(() => <MyComponent  />)

    let button = getByTestId("trigger.some.action.button")

    fireEvent.press(button)

    expect(unsubscribe).toHaveBeenCalled()
})

рдпрд╣ рдЗрддрдирд╛ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдХреЗрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрднреА рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ .. рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реБрдЭрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

es6 рдореЙрдбреНрдпреВрд▓ рдХреЛрдб:

export const funcA = () => {};
export const funcB = () => {
  funcA();
};

рдХреЙрдордирдЬреЗрдПрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж:

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.funcB = exports.funcA = void 0;

var funcA = function funcA() {};

exports.funcA = funcA; // You can mock or add a spy  on this `funcA`

var funcB = function funcB() {
  funcA();  // This is still original `funcA`
};

exports.funcB = funcB;

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред

  1. рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рдирдХрд▓реА/рдЬрд╛рд╕реВрд╕ funcA рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ
function funcA() {}
exports.funcA = funcA;

function funcB() {
  exports.funcA(); // Now, this `exports.funcA` is added a spy or mocked. Keep the same reference to `funcA`
}
exports.funcB = funcB;

рдпрд╛,

export let funcA = () => {};
export const funcB = () => {
  exports.funcA();
};

рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо:

 PASS  myModule.test.ts (9.225s)
  funcB
    тЬУ should call funcA (3ms)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |     100 |      100 |     100 |     100 |                   
 myModule.ts |     100 |      100 |     100 |     100 |                   
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        10.967s
  1. funcA рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП
    ...

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ: https://nodejs.org/api/modules.html#modules_exports_shortcut , рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ require рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ

рдЗрд╕ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛
https://stackoverflow.com/a/53402206/1217998

рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк jest.fn рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

jest.mock('../../utils', () => {
  const actualUtils = jest.requireActual('../../utils');
  const originalImplementation = actualUtils.someFun;

  return {
    ...actualUtils,
    someFun: jest.fn()
      .mockImplementation(originalImplementation),
  };
});
const utils = require('../../utils');

рдлрд┐рд░ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ рдиреЙрд░реНрдорд▓ рдХреА рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рддрд░рд╣ рдореЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

jest.spyOn(utils, 'someFun').mockReturnValueOnce(true);

рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

beforeEach(() => {
    jest.clearAllMocks();
  });

рдЗрд╕ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛
https://stackoverflow.com/a/53402206/1217998

рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк jest.fn рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

jest.mock('../../utils', () => {
  const actualUtils = jest.requireActual('../../utils');
  const originalImplementation = actualUtils.someFun;

  return {
    ...actualUtils,
    someFun: jest.fn()
      .mockImplementation(originalImplementation),
  };
});
const utils = require('../../utils');

рдлрд┐рд░ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ рдиреЙрд░реНрдорд▓ рдХреА рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рддрд░рд╣ рдореЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

jest.spyOn(utils, 'someFun').mockReturnValueOnce(true);

рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

beforeEach(() => {
    jest.clearAllMocks();
  });

рд╢реБрдХреНрд░рд┐рдпрд╛!

рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЬреЗрд╕реНрдЯ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╣ ES рдЖрдпрд╛рдд рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ Node рдХреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
https://jestjs.io/docs/hi/jest-object#jestrequireactualmodulename

рдореЙрдХ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рднреАрддрд░ рд╕реЗ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХрднреА-рдХрднреА рдпрд╣ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд╕реНрдЯрдо (рдЕрддрд┐рд░рд┐рдХреНрдд) рдЪрд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:

jest.mock('./someModule', () => {
  const moduleMock = require.requireActual('./someModule');
  return {
    ...moduleMock,
    // will mock this function 
    someFunction: (args) =>
      moduleMock.someFunction({
        ...args,
        customArgument,
      }),
  };
});

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХреБрдЫ рдмреЗрд╣рддрд░ рдпрд╛ рдЖрд╕рд╛рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА :)

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдореИрдВрдиреЗ https://github.com/magicmark/jest-how-do-i-mock-x/blob/master/src/function-in-same-module/README рдореЗрдВ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЦреАрдВрдЪрд╛ рд╣реИ

рдпрд╣ рдУрдкреАрдПрд╕ рдкреНрд░рд╢реНрди/рдореБрджреНрджреЗ рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдкрд╛рдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрди рдЖрдпрд╛рддреЛрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рд╣реИ, рдпрд╣ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдХрд╛рдо рд╣реИред

// package.json
...
"scripts": {
    "test": "jest",

...
"devDependencies": {
    "@babel/preset-env": "^7.11.5",
    "jest": "^24.9.0",
...

```рдЬреЗрдПрд╕
// рдмреЗрдмрд▓.config.js

рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯ = {
рдкреНрд░реАрд╕реЗрдЯ: [
[
'@ рдмреЗрдмреЗрд▓/рдкреНрд░реАрд╕реЗрдЯ-рдПрдирд╡реА',
{
рд▓рдХреНрд╖реНрдп: {
рдиреЛрдб: 'рд╡рд░реНрддрдорд╛рди',
},
},
],
],
};

```js
// module-utils.js

export const isBabaYaga = () => {
  return false
}

// module.js

import { isBabaYaga } from './module-utils'

export const isJohnWickBabaYaga = () => {
  return isBabaYaga()
}
// modules.test.js

import { isJohnWickBabaYaga } from './module';

jest.mock('./module-utils', () => ({
    isBabaYaga: jest.fn(() => true)
}))

test('John Wick is the Baba Yaga', () => {

    // when
    const isBabaYaga = isJohnWickBabaYaga()

    // then
    expect(isBabaYaga).toBeTruthy()
});
PASS  src/module.test.js
тЬУ John Wick is the Baba Yaga (4ms)

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЛрдб рдмрджрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдмреЗрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдпрд╣ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╡рд╣рд╛рдВ рдПрдХ рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рднреА рд╕рд╣рд╛рдпрддрд╛рдХрд╛рдлреА рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реЛрдЧреА!

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЛрдб рдмрджрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдмреЗрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдпрд╣ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╡рд╣рд╛рдВ рдПрдХ рдмреЗрдмреЗрд▓ рдкреНрд▓рдЧрдЗрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рднреА рд╕рд╣рд╛рдпрддрд╛рдХрд╛рдлреА рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реЛрдЧреА!

рдХреНрдпрд╛ рдЖрдкрдиреЗ https://github.com/facebook/jest/issues/936#issuecomment -659597840 рдЪреЗрдХ рдХрд┐рдпрд╛ рд╣реИ? рд╡рд╣рд╛рдВ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреНрд░реЛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдлрд╛рдЗрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдирдХрд▓реА рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Secretmapper picture Secretmapper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rosiakr picture rosiakr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kentor picture kentor  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jardakotesovec picture jardakotesovec  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kgowru picture kgowru  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ