Sinon: Mock은 onCallμ—μ„œ 잘 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2014λ…„ 06μ›” 12일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: sinonjs/sinon

onCall 및 μ˜ˆμƒ 인수둜 μž‘μ—…ν•  λͺ¨μ˜λ₯Ό 얻을 수 μ—†μŠ΅λ‹ˆλ‹€.
μ•„λž˜ μ½”λ“œλŠ” 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")
    );

λΆˆν–‰νžˆλ„ Stub μ—λŠ” withExactArgs κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  4 λŒ“κΈ€

.stubμ—μ„œλ„ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ©”μ„œλ“œκ°€ 잘λͺ»λœ 인수둜 ν˜ΈμΆœλ˜μ—ˆλ‹€λŠ” 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. 첫 번째 호좜의 인수λ₯Ό ν‘œμ‹œν•˜μ§€λ§Œ 두 번째 호좜의 μš”κ΅¬ 사항을 ν‘œμ‹œν•©λ‹ˆλ‹€. 마치 onCall(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")
    );

λΆˆν–‰νžˆλ„ Stub μ—λŠ” withExactArgs κ°€ μ—†μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ...

λ™μΌν•œ 인수둜 μ—¬λŸ¬ 번 호좜된 κ²½μš°μ—λ„ μŠ€ν…μ— λŒ€ν•œ κ°œλ³„ ν˜ΈμΆœμ„ 식별 ν•  수

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 λ“±κΈ‰