mocha-phantomjs用于回调函数的测试用例

时间:2014-04-03 12:02:49

标签: javascript unit-testing callback mocha 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 个答案:

答案 0 :(得分: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测试结束了。

否则,Mocha将运行给it的回调,并且不会等待handleData执行。测试将立即结束,没有错误,所以摩卡会说它已经过去了。