5

我有两个测试用例,即它(“应该通过......”)..和它(“应该失败......”)..,当我测试它时,它给出了超过 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);
    };
});
});

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

4

1 回答 1

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有关闭包和绑定的更多信息,请参阅这篇 jQuery 学习中心文章。您可以通过以下方式纠正:

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

但是,在这种情况下,您不妨移到this.setTimeout(1500)handleData 之外,它会产生相同的效果。

另一部分是,如果超过 2000 毫秒超时,您的 1500 毫秒限制也将被超过。此外,这是不确定的,因为它取决于 flickr API 响应时间。

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

于 2014-04-11T12:10:47.167 回答