it('should for something', function check(done) {
browser.sleep(2000);
$('.csTx').isPresent().then(function(result) {
if(result) {
done();
} else {
xPage.clickBack();
check(done);
}
})
}, 30000);
有人可以解释done()的工作原理以及它的用途。我用谷歌搜索了它,但找不到任何容易让我理解的信息。我正在使用量角器和茉莉花进行自动化。请考虑以上代码。
答案 0 :(得分:2)
以下是您可以运行的示例describe
,看看会发生什么。我必须提到我不使用量角器,因此可能存在一些与其特定功能有关的额外考虑因素。
describe('Done functionality', function(){
var echoInOneSecond = function(value){
console.log('creating promise for ', value);
return new Promise(function(resolve, reject){
console.log('resolving with ', value);
resolve(value);
});
};
it('#1 this will untruly PASS', function(){
var p = echoInOneSecond('value #1');
p.then(function(value){
console.log('#1 expecting...and value is ', value);
expect(value).toBe('value #1');
});
});
it('#2 this will NOT FAIL', function(){
var p = echoInOneSecond('value #2');
p.then(function(value){
console.log('#2 expecting... and value is ', value);
expect(value).not.toBe('value #2');
});
});
it('3 = will truly FAIl', function(done){
var p = echoInOneSecond('value #3');
p.then(function(value){
console.log('#3 expecting... and value is ', value);
expect(value).not.toBe('value #3');
done();
});
});
it('4 = this will truly PASS', function(done){
var p = echoInOneSecond('value #4');
p.then(function(value){
console.log('#4 expecting... and value is ', value);
expect(value).toBe('value #4');
done();
});
});
});
运行测试时,您将注意到序列:首先是承诺#1,#2,#3将逐一创建并解决。请注意,#1和#2的期望不会被运行,因为promises是异步解析的。
然后,由于#3测试使用done
,因此在创建#3承诺之后,将评估所有先前承诺的then
的函数:您将看到#1;#1期待... 。'和#2;期待......',但jasmine不关心这一点,因为测试#1和#2已经完成,所有与他们有关的事情都已完成。只有在那些#3预期之后,它才会真正失败,因为茉莉花确实会照顾done()
之前发生的一切。
然后你可以看到#4测试正常流量 - 创造承诺,解决,期望,茉莉花所考虑的一切,所以期望真的会过去。
答案 1 :(得分:0)
我还没有使用量角器。对于Jasmine,我的理解是done
使Jasmine
处于等待状态,但不是传统意义上的超时。它不像总是运行的计时器。我认为done
充当Jasmine
中的检查点。当Jasmine
看到某个规范使用done
时,它将知道它无法继续进行下一步(例如运行下一个规范或将该规范标记为已完成,即声明当前规范的判决),除非代码行包含done
的文件已运行。
例如,茉莉花通过了这个规范,尽管它应该失败,因为它不等待setTimeout被调用。
fit('lets check done',()=>{
let i=0;
setTimeout(function(){
console.log("in timeout");
expect(i).toBeTruthy();//the spec should fail as i is 0 but Jasmine passes it!
},1000);
//jasmine reaches this point and see there is no expectation so it passes the spec. It doesn't wait for the async setTimeout code to run
});
但是如果我的目的是让Jasmine等待setTimeout
中的异步代码,那么我在异步代码中使用done
fit('lets check done',(done)=>{
let i=0;
setTimeout(function(){
console.log("in timeout");
expect(i).toBeTruthy();//with done, the spec now correctly fails with reason Expected 0 to be truthy.
done();//this should make jasmine wait for this code leg to be called before declaring the verdict of this spec
},1000);
});
请注意,done
应该在我要检查断言的地方调用。
fit('lets check done',(done)=>{
let i=0;
setTimeout(function(){
console.log("in timeout");
expect(i).toBeTruthy();//done not used at the right place, so spec will incorrectly ypass again!.
//done should have been called here as I am asserting in this code leg.
},1000);
done();//using done here is not right as this code leg will be hit inn normal execution of it.
});
总而言之,认为完成是对Jasmine的提示-“我现在完成了”或“当代码点击时我将完成”