Как проверить асинхронный обратный вызов? - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь проверить асинхронный обратный вызов, проверив, что он вызывается, скажем, n раз за m секунды.

Вот мой код:

test("async callback", function() {
    expect(1);
    var called = 0;

    var callback = function() {called++;};

    var model = new Model(callback);
    model.startCallbacks();

    function theTest() {         // call this a few seconds later and verify
        model.stopCallbacks();   //   that the callback has been called n times
        equal(3, called, "number of times callback was called");
    }

    setTimeout(theTest, 10000); // wait about 10 seconds until calling theTest
});

(model.startCallbacks и model.stopCallbacks реализованы с setInterval.)

Это не работает.Я думаю, это потому, что выполнение завершается после завершения функции тестирования, пока callback все еще выполняется асинхронно.

Что я хочу проверить: , что model правильно вызывает callback.Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 02 марта 2012
// use asyncTest instead of test
asyncTest("async callback", function() {
    expect(1);
    var called = 0;

    var callback = function() {called++;};

    var model = new Model(callback);
    model.startCallbacks();

    function theTest() {         // call this a few seconds later and verify
        model.stopCallbacks();   // that the callback has been called
        equal(3, called, "number of times callback was called");

        // THIS IS KEY: it "restarts" the test runner, saying
        // "OK I'm done waiting on async stuff, continue running tests"
        start();
    }

    setTimeout(theTest, 10000); // wait about 10 seconds until calling theTest
});
2 голосов
/ 02 марта 2012

Вы должны использовать функции запуска и остановки для асинхронного тестирования (см. документы ), пример:

test("a test", function() {
  stop();
  $.getJSON("/someurl", function(result) {
    equal(result.value, "someExpectedValue");
    start();
  });
});

Ваш пример будет:

test("async callback", function() {
    stop(1);
    var called = 0;

    var callback = function() {called++;};

    var model = new Model(callback);
    model.startCallbacks();

    function theTest() {         // call this a few seconds later and verify
        model.stopCallbacks();   //   that the callback has been called n times
        equal(3, called, "number of times callback was called");
        start();
    }

    setTimeout(theTest, 10000); // wait about 10 seconds until calling theTest
});

Вы также можете использовать ярлык asyncTest .

...