我有两个测试用例,即它(“应该通过..”)..和它(“应该失败...”)..,当我测试它时,超时错误超过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);
};
});
});
对于第一次测试我超时超时错误,但第二次测试运行良好。 请告诉我我错在哪里。
答案 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,如果这是一个单元测试(与集成测试相反)。