рдЖрдкрдиреЗ рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдереА?
рдЬрдм рдореИрдВ рдХрдХреНрд╖рд╛ рдкрд░ рдПрдХ рдирдХрд▓реА рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ withArgs
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рддрднреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм withArgs
рдХреА рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ
рдХреИрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░реЗрдВрдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдХрдХреНрд╖рд╛ C
рдШреЛрд╖рд┐рдд рдХреА рд╣реИ:
class C {
static foo(arg1, arg2) {return 'foo';}
}
рдореИрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ foo
рдкрд░ рдПрдХ рдирдХрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ C
:
it('test withArgs mock', () => {
let CMock = sinon.mock(C);
let fooStub = CMock.expects('foo');
fooStub.withArgs('a', 'b').returns(1);
fooStub.withArgs('c', 'd').returns(2);
expect(fooStub('a', 'b')).toEqual(1);
expect(fooStub('c', 'd')).toEqual(2);
CMock.restore();
});
рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ:
рдПрдХреНрд╕рдкреЗрдХреНрдЯреЗрд╢рди рдПрд░рд░: рдлреВ рдХреЛ рдЧрд▓рдд рддрд░реНрдХ рдорд┐рд▓реЗ ["рдП", "рдмреА"], рдЕрдкреЗрдХреНрд╖рд┐рдд ["рд╕реА", "рдбреА"]
Object.fail рдкрд░ (node_modules/sinon/lib/sinon/mock-expectation.js:281:25)
рд╕рдорд╛рд░реЛрд╣ рдореЗрдВред(node_modules/sinon/lib/sinon/mock-expectation.js:182:33)
Array.forEach (рдореВрд▓) рдкрд░
Function.verifyCallAllowed рдкрд░ (node_modules/sinon/lib/sinon/mock-expectation.js:175:27)
Function.invoke рдкрд░ (node_modules/sinon/lib/sinon/mock-expectation.js:78:14)
рдкреНрд░реЙрдХреНрд╕реА рдкрд░ (node_modules/sinon/lib/sinon/spy.js:89:22)
рдЬрдмрдХрд┐ рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
it('test withArgs stub', () => {
let fooStub = sinon.stub(C, 'foo');
fooStub.withArgs('a', 'b').returns(1);
fooStub.withArgs('c', 'd').returns(2);
expect(fooStub('a', 'b')).toEqual(1);
expect(fooStub('c', 'd')).toEqual(2);
fooStub.restore();
});
рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
it('test one withArgs mock', () => {
let CMock = sinon.mock(C);
let fooStub = CMock.expects('foo');
fooStub.withArgs('a', 'b').returns(1);
expect(fooStub('a', 'b')).toEqual(1); // ok
CMock.restore();
});
it('test one withArgs mock', () => {
let CMock = sinon.mock(C);
let fooStub = CMock.expects('foo');
fooStub.withArgs('a', 'b').returns(1);
expect(fooStub('c', 'd')).toEqual(1); // error: foo received wrong arguments ["c", "d"], expected ["a", "b"]
CMock.restore();
});
рдорддрд▓рдм рд╕рдорд╕реНрдпрд╛ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм withArgs
рдХрдИ рдмрд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ #1381 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдирдореВрдирд╛ рд╕рдорд╕реНрдпрд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдореЛрдХреНрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ рдЪреЛрдЯ рдкрд╣реБрдБрдЪрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ - рдЕрдХреНрд╕рд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ :-)
рдореИрдВрдиреЗ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реАред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
class C {
static foo(arg1, arg2) {return 'foo';}
}
it('test withArgs mock', () => {
let CMock = sinon.mock(C);
CMock.expects('foo').withArgs('a', 'b').returns(1);
CMock.expects('foo').withArgs('c', 'd').returns(2);
expect(C.foo('a', 'b')).toEqual(1);
expect(C.foo('c', 'd')).toEqual(2);
CMock.restore();
});
рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рдХрд╛рд░рдг рд╣реИрдВ рдФрд░ рдореВрд▓ рдЕрдВрдХ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
expects
рдмрдирд╛рддрд╛ рд╣реВрдВредexpects
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВредрдорддрд▓рдм, рдпрд╣ рдпрд╛ рддреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
it('test withArgs mock', () => {
let CMock = sinon.mock(C);
CMock.expects('foo').withArgs('a', 'b').returns(1);
let fooStub = CMock.expects('foo').withArgs('c', 'd').returns(2);
expect(fooStub('a', 'b')).toEqual(1); // Error: foo received wrong arguments ["a", "b"], expected ["c", "d"]
expect(fooStub('c', 'd')).toEqual(2);
CMock.restore();
});
рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?
рд╣рд░ рдмрд╛рд░ expects
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
minCalls/maxCalls
рд╕рд╛рде рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╕реНрдЯрдм - рдЬреЛ рд╡реЗ рдЪрд░ рд╣реИрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП once()
рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ) рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдпрд╣ рдХрд┐ рдпрд╣ рдПрдХ "рд╕реНрдХреЛрдкреНрдб рд╕реНрдЯрдм" рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЕрдиреНрдп expects
рдХрдиреЗрдХреНрд╢рди рд╣реИред рдпрд╣ expects
рд╕реЗ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рд╣реИредрдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ:
expects
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕ expects
рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдЧреАредexpects
рдкрд░ рдЦреЛрдЬ рдХрд░реЗрдЧрд╛ рдФрд░ рдЬреЛ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдЙрд╕реЗ рдвреВрдВрдвреЗрдЧрд╛ред рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ, рддреЛ рд╡рд╣ рдкрд╣рд▓реЗ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛редрдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ? рдпрд╣ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдкрд░ expects
рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ stub
(рдЕрддрд┐рд░рд┐рдХреНрдд minCalls/maxCalls
) рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:
stub
рдФрд░ mock-expectation
рдмреАрдЪ рдЕрдзрд┐рдХ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдЕрдм, minCalls/maxCalls
рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдЪреВрдВрдХрд┐ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ expectation
рд╣реИ,
once()
, twice()
рдЖрджрд┐ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред let fooStub = CMock.expects('foo').withArgs('a', 'b').returns(1).twice();
fooStub.withArgs('c', 'd').returns(2).once(); // Does not affect the previous expectation.
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
once()
, twice()
рдЖрджрд┐ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗрдВред CMock.expects('foo').withArgs('a', 'b').returns(1).twice(); // `twice()` returns `null`, so that one has to call `expects()` again to set expectations for other arguments.
CMock.expects('foo').withArgs('c', 'd').returns(2).once();
рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ, рд▓реЗрдХрд┐рди рдЖрдк foo
рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдирд╣реАрдВ рджрдмрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ:
CMock.expects('foo').withArgs('a', 'b').returns(1).withArgs('c', 'd').returns(2).twice(); // I guess that this should only affect the last `withArgs`?
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВрдиреЗ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реАред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рдХрд╛рд░рдг рд╣реИрдВ рдФрд░ рдореВрд▓ рдЕрдВрдХ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
expects
рдмрдирд╛рддрд╛ рд╣реВрдВредexpects
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВредрдорддрд▓рдм, рдпрд╣ рдпрд╛ рддреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?
рд╣рд░ рдмрд╛рд░
expects
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ:minCalls/maxCalls
рд╕рд╛рде рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╕реНрдЯрдм - рдЬреЛ рд╡реЗ рдЪрд░ рд╣реИрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПonce()
рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ) рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдпрд╣ рдХрд┐ рдпрд╣ рдПрдХ "рд╕реНрдХреЛрдкреНрдб рд╕реНрдЯрдм" рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЕрдиреНрдпexpects
рдХрдиреЗрдХреНрд╢рди рд╣реИред рдпрд╣expects
рд╕реЗ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рд╣реИредрдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ:
expects
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕expects
рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдЧреАредexpects
рдкрд░ рдЦреЛрдЬ рдХрд░реЗрдЧрд╛ рдФрд░ рдЬреЛ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдЙрд╕реЗ рдвреВрдВрдвреЗрдЧрд╛ред рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ, рддреЛ рд╡рд╣ рдкрд╣рд▓реЗ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛редрдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ? рдпрд╣ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдкрд░
expects
рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓stub
(рдЕрддрд┐рд░рд┐рдХреНрддminCalls/maxCalls
) рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:stub
рдФрд░mock-expectation
рдмреАрдЪ рдЕрдзрд┐рдХ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдЕрдм,
minCalls/maxCalls
рдХреНрдпрд╛ рд╣реЛрдЧрд╛?рдЪреВрдВрдХрд┐ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ
expectation
рд╣реИ,once()
,twice()
рдЖрджрд┐ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВредрд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
once()
,twice()
рдЖрджрд┐ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗрдВредрдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ, рд▓реЗрдХрд┐рди рдЖрдк
foo
рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдирд╣реАрдВ рджрдмрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ: