Sinon: Mocks لا تعمل بشكل جيد مع onCall

تم إنشاؤها على ١٢ يونيو ٢٠١٤  ·  4تعليقات  ·  مصدر: sinonjs/sinon

لا يمكنني الحصول على mocks للعمل مع 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")
    );

لسوء الحظ ، لا يوجد withExactArgs على Stub .

ال 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")
    );

لسوء الحظ ، لا يوجد withExactArgs على Stub .

لكن...

يمكنك تحديد المكالمات الفردية إلى كعب، حتى عندما دعا عدة مرات مع نفس الحجج. على سبيل المثال

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

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

إذا كان هذا يساعد؟

@ مانتوني أعتقد أنه يمكن إغلاق هذه القضية

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

NathanHazout picture NathanHazout  ·  3تعليقات

brettz9 picture brettz9  ·  3تعليقات

pavelkornev picture pavelkornev  ·  4تعليقات

stephanwlee picture stephanwlee  ·  3تعليقات

akdor1154 picture akdor1154  ·  4تعليقات