Sinon: рдСрдирдХреЙрд▓ рдХреЗ рд╕рд╛рде рдореЙрдХ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдЬреВрди 2014  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sinonjs/sinon

рдореБрдЭреЗ рдСрдирдХреЙрд▓ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдХ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреЗред
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб Object #<Object> has no method 'withExactArgs'

var mock = sinon.mock();

mock.exactly(2);
mock.onCall(0).withExactArgs("arg1", "arg2").returns("foo");

mock.verify();

withExactArgs рд╡рд┐рдзрд┐ рд╕реНрдЯрдм рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ: mock.onCall(0).stub.withExactArguments ред

рдХреНрдпрд╛ рдпрд╣ рдЗрд░рд╛рджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╛ рдмрдЧ рд╣реИ?

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

рдпрд╣ рди рддреЛ рдЗрд░рд╛рджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдФрд░ рди рд╣реА рдмрдЧред рдЖрдк рд░реВрдкрдХреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред onCall рдФрд░ withArgs рджреЛрдиреЛрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЖрдордВрддреНрд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред

// So either, 

mock.onCall(0).returns("foo")

// OR

mock.withArgs("arg1", "arg2").returns("foo")

// but not both

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

    var stub = sinon.stub();

    stub.withArgs("bar1", "bar2").returns("bar");
    stub.withArgs("foo1", "foo2").returns("foo");

    stub("bar1", "bar2");
    stub("foo1", "foo2");

    sinon.assert.calledTwice(stub);

    // verify the 2 calls
    sinon.assert.calledWithExactly(stub, "bar1", "bar2");
    sinon.assert.calledWithExactly(stub, "foo1", "foo2");

    // verify the 2 calls in order
    sinon.assert.callOrder(
        stub.withArgs("bar1", "bar2"),
        stub.withArgs("foo1", "foo2")
    );

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, withExactArgs рдкрд░ рдХреЛрдИ Stub ред

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ .stub рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдЧрд▓рдд рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд╣рд▓реА рдХреЙрд▓ рд╕реЗ рддрд░реНрдХ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВред рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдСрдирдХреЙрд▓ (0) рдХреЛ рддреНрдпрд╛рдЧ рджреЗрддрд╛ рд╣реИред

var mock = sinon.mock();

mock.exactly(2);
mock.onFirstCall().stub.withExactArgs("bar1", "bar2").returns("bar");
mock.onSecondCall().stub.withExactArgs("foo1", "foo2").returns("foo");

mock("bar1", "bar2");
mock("foo1", "foo2");

mock.verify();

ExpectationError: Anonymous mock received wrong arguments ["bar1", "bar2"], expected ["foo1", "foo2"]

рдпрд╣ рди рддреЛ рдЗрд░рд╛рджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдФрд░ рди рд╣реА рдмрдЧред рдЖрдк рд░реВрдкрдХреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред onCall рдФрд░ withArgs рджреЛрдиреЛрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЖрдордВрддреНрд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред

// So either, 

mock.onCall(0).returns("foo")

// OR

mock.withArgs("arg1", "arg2").returns("foo")

// but not both

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

    var stub = sinon.stub();

    stub.withArgs("bar1", "bar2").returns("bar");
    stub.withArgs("foo1", "foo2").returns("foo");

    stub("bar1", "bar2");
    stub("foo1", "foo2");

    sinon.assert.calledTwice(stub);

    // verify the 2 calls
    sinon.assert.calledWithExactly(stub, "bar1", "bar2");
    sinon.assert.calledWithExactly(stub, "foo1", "foo2");

    // verify the 2 calls in order
    sinon.assert.callOrder(
        stub.withArgs("bar1", "bar2"),
        stub.withArgs("foo1", "foo2")
    );

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, withExactArgs рдкрд░ рдХреЛрдИ Stub ред

рддрдерд╛рдкрд┐...

рдЖрдк рдПрдХ рд╣реА рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рднреА, рд╕реНрдЯрдм рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓ рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

stub.withArgs("foo")
  .onCall(0).returns("a")
  .onCall(1).returns("b");

stub.withArgs("bar")
  .onCall(0).returns("c")
  .onCall(1).returns("d");

рдЕрдЧрд░ рд╡рд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ?

@mantoni рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

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

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

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

ndhoule picture ndhoule  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ALeschinsky picture ALeschinsky  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kevinburkeshyp picture kevinburkeshyp  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ