2000ms的超时超过了摩卡

时间:2014-04-11 10:47:04

标签: javascript unit-testing callback mocha mocha-phantomjs

我有两个测试用例,即它(“应该通过..”)..和它(“应该失败...”)..,当我测试它时,超时错误超过2000毫秒。

describe("flickrphotoSearch", function () {
it("should pass with correct inputs", function (done) {
    flickrApplication.flickrPhotoSearch("hello", "flickr_user_Key", 1, handleData);
    function handleData(photoUrl, done) {
        this.setTimeout(1500);
        assert.isString(photoUrl.toString(), 'not a string');
        setTimeout(done, 1000);
    };
});
it("should fail with wrong key", function (callingDone) {
    flickrApplication.flickrPhotoSearch("hello", "wrong key", 1, handleData);
    function handleData(photoUrl, done) {
        this.setTimeout(1500);
        assert.equal(photoUrl.stat, "ok", photoUrl.message);
        setTimeout(done, 1000);
    };
});
});

对于第一次测试我超时超时错误,但第二次测试运行良好。 请告诉我我错在哪里。

1 个答案:

答案 0 :(得分:1)

这有两个部分。首先,当您尝试设置测试的超时时,您不会在右侧对象上调用setTimeout方法。这是因为关闭:

describe("flickrphotoSearch", function () {
it("should pass with correct inputs", function (done) {
    # 'this' is the mocha test here.
    flickrApplication.flickrPhotoSearch("hello", "flickr_user_Key", 1, handleData);
    function handleData(photoUrl, done) {
        this.setTimeout(1500); # What's 'this' here? The global object.
        assert.isString(photoUrl.toString(), 'not a string');
        setTimeout(done, 1000);
    };
});

调用handleData时,this不会绑定任何内容,因为函数是自己调用的,而不是作为对象方法调用。有关闭包和this绑定的更多信息,请参阅this jQuery Learning Center article。您可以通过执行以下操作来纠正错误:

flickrApplication.flickrPhotoSearch("hello", "flickr_user_Key", 1, handleData.bind(this));

但是,在这种情况下,您也可以将this.setTimeout(1500)移到handleData之外,并且它具有相同的效果。

另一部分是,如果超过2000ms超时,也会超过1500ms的限制。此外,这是非确定性的,因为它取决于flickr API响应时间。

我的建议是模拟flickr API,如果这是一个单元测试(与集成测试相反)。