Тест mocha-phantomjs для функции обратного вызова

У меня есть модуль, в котором у меня есть эта функция

flickrPhotoSearch: function (searchByName, flickrUserKey, numberOfImages, callbackData) {
    return $.ajax({
        url: commonConstants.BASE_URL + "flickr.photos.search&api_key=" + flickrUserKey + "&tags=" + searchByName + "&format=json&jsoncallback=?",
        dataType: 'json',
        async: true,
        success: function (jsonData) {
            if (jsonData.stat === commonConstants.JSON_SUCCESS) {
                if (jsonData.photos['photo'].length < commonConstants.DATA_LENGTH) {
                    callbackData(jsonData);
                } else {
                    var flickrImage = flickrApplication.jsonToImage(jsonData, numberOfImages);
                    callbackData(flickrImage);
                }
            } else {
                callbackData(jsonData);
            }
        }
    });
}

Я хочу проверить эту функцию, и я выбираю mocha-phantomjs для этого. И это мой контрольный пример

describe("flickrphotoSearch", function () {
    it("should fail with wrong key", function () {
        flickrApplication.flickrPhotoSearch(testConstant.CORRECT_NAME, testConstant.WRONG_KEY, testConstant.CONSTANT_ONE, handleData);
        function handleData (photoUrl) {
            assert.equals(photourl.stat, "pass", photoUrl.message);
        }
    });
});

Теперь этот тест должен провалиться из-за ошибки "Invalid API Key", Но это прошло. Я думаю, это потому, что я использовал утверждение внутри функции обратного вызова, т.е. handleData(),

я использую mocha-phantomjs настройка и chai библиотека утверждений.

Я искал учебники и демонстрации, но не нашел ни одного. Тоже попробовал mocha-phantomjs примеры, но без посторонней помощи я выкладываю здесь.

Подскажите пожалуйста как проверить функцию обратного вызова в mocha-phantomjs,

1 ответ

Решение

То, что вы описываете, является типичным симптомом для теста, который является асинхронным, но тестируется синхронно. Решение состоит в том, чтобы использовать done обратный вызов в вашем тесте:

it("should fail with wrong key", function (done) {
    flickrApplication.flickrPhotoSearch(testConstant.CORRECT_NAME, testConstant.WRONG_KEY, testConstant.CONSTANT_ONE, handleData);
    function handleData (photoUrl) {
        assert.equals(photourl.stat, "pass", photoUrl.message);
        done();
    }
});

Когда вы добавляете done аргумент обратного вызова, который вы даете it, вы говорите Mocha, что тест асинхронный, а затем вы должны вызвать его в асинхронном обратном вызове (handleData здесь), чтобы сказать Мокко, что тест закончен.

В противном случае Mocha запустит обратный вызов, данный it и не буду ждать handleData выполнить. Тест закончится сразу же, без ошибок, поэтому Мокко скажет, что он прошел.

Другие вопросы по тегам