рдореИрдВ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд╕рд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯ рджреЛрдиреЛрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдпрд╣ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ 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
рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирдХрд▓ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдореЗрд░реЗ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рддреЛрдбрд╝рдирд╛ рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдпрд╣ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реИред
рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ-рдореЙрдХ рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдПрд╕рдЯреА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрд╕ рдПрдПрд╕рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдирдХрд▓реА рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИ: 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-1expect(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 рдХреЗ рдЙрддреНрддрд░ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░ рдореЙрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЗрдЬ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдХ рд╕рдВрдмрдВрдзрд┐рдд рдбреЙрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛, рджрд┐рдЦрд╛рдирд╛ рдпрд╛ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдореЙрдХрд┐рдВрдЧ рдкрд░ рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдХреЗ рдПрдХ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдХреБрдЫ 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
рдПрдкреАрдЖрдИред
рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╡рд╛рд░реНрддрд╛рд▓рд╛рдкреЛрдВ рдХреЛ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ, рддреЛ рдЙрддреНрддрд░ рдмреИрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рд╣реИ , рдпрд╣ рдкреНрд▓рдЧрдЗрди рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдХреА рдереАред
рдХреГрдкрдпрд╛ рдЙрд╕ рдкрд░рд┐рд╡рд╛рдж рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЖрдк рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВрдЧреЗред
рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
m
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ f
, g
рдФрд░ h
рдЬрд╣рд╛рдВ g
рдФрд░ h
рдХреЙрд▓ f
ред рд╣рдо f
рдХрд╛ рдЙрдкрд╣рд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ g
рдФрд░ h
рдЕрд╕рд▓реА f
рдмрдЬрд╛рдп рдирдХрд▓реА рдХреЙрд▓ рдХрд░реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рд╕реАрдзреЗ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ f
рдХреЛ рд╣рдореЗрд╢рд╛ exports
рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ cpojer рдиреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ ред рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рдЖрдкрдХрд╛ рдореЙрдбреНрдпреВрд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ ES6 рдЖрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреИрдмреЗрд▓ рдореЗрдВ рднреА рд╕рдЪ рд╣реИ)редf
рдХреЛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ m2
ред рдлрд┐рд░ m
import {f} from 'm2'
рдЬреИрд╕рд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрдЧрд╛ рдФрд░ рдЬрдм g
рдФрд░ h
рдХреЙрд▓ f
, рддреЛ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ m2.f
рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ m2 = require('./m2')
(рдмреЗрдмреЗрд▓/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрд╡рд╛рдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛)ред рдпрд╣ f
рдордЬрд╝рдмреВрддреА рд╕реЗ рдордЬрд╛рдХ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЧреНрд░реЗрдкреИрдВрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдк рдХреЙрд▓ рдХреЛ рдордЬрд╝рдмреВрддреА рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдореЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ ред рдиреЛрдЯ: рдЧреНрд░реЗрдкреИрдВрдЯреНрд╕ рд╕рдорд╛рдзрд╛рди рдЕрдм рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ: " jest.mock()
рдореЙрдбреНрдпреВрд▓ рдлрд╝реИрдХреНрдЯрд░реА рдХреЛ рдХрд┐рд╕реА рднреА рдЖрдЙрдЯ-рдСрдл-рд╕реНрдХреЛрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ - рдЕрдорд╛рдиреНрдп рд╡реИрд░рд┐рдПрдмрд▓ рдПрдХреНрд╕реЗрд╕: __рдЕрд╕рд╛рдЗрди"ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ; рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, Object.assign
рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред(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
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдордЬрд╛рдХ рдирд╣реАрдВ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛редрдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рдХрд▓реНрдк рдпрд╛ рддреЛ рд╣реИрдВ:
- рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐
foo
рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░реЗ рдЬрд┐рд╕рдореЗрдВbar
- рдмреЗрдмреЗрд▓-рдкреНрд▓рдЧрдЗрди-рд░реАрд╡рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ!
рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рдерд╛
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдордЬрд╝рд╛рдХ рдХреИрд╕реЗ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреА рдореЗрд░реА рд╕рдордЭ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЧрдИ рдереА тАНтЩВ
рдореВрд▓ рд░реВрдк рд╕реЗ
рдпрджрд┐ 2 рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реИрдВ, рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдЕрдЧрд░ foo
рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ bar
function bar() {
return 'some-result'
}
function foo(){
return bar() // <-- the function I want to mock
}
рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ bar
рдбрд╛рд▓реЗрдВ (рдордЬрд╛рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)
рдореИрдВрдиреЗ bar
рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдЕрдм рдореИрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛
рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ @yoni-abtech рдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж
рдЗрд╕ рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдмрд╛рд░-рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╡рд╣рд╛рдВ 3 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ ....
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);
});
});
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');
});
});
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВред
рдиреЛрдЯ: рдмреЗрдмреЗрд▓ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрдо рд╕реЗ рдХрдо рдЕрдиреБрдХреВрд▓ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ 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;
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред
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
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 рдЪреЗрдХ рдХрд┐рдпрд╛ рд╣реИ? рд╡рд╣рд╛рдВ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреНрд░реЛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдлрд╛рдЗрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдирдХрд▓реА рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рддреБрдо рдХрд░ рд╕рдХрддреЗ рд╣реЛ:
рджреЗрдЦреЗрдВ http://facebook.github.io/jest/docs/api.html#mock -functions