done()的用途和使用方法(量角器,茉莉花)

时间:2017-02-16 18:08:53

标签: jasmine protractor

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()的工作原理以及它的用途。我用谷歌搜索了它,但找不到任何容易让我理解的信息。我正在使用量角器和茉莉花进行自动化。请考虑以上代码。

2 个答案:

答案 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的提示-“我现在完成了”或“当代码点击时我将完成”