首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完成了什么()是为了以及如何使用它(量角器,茉莉)

完成了什么()是为了以及如何使用它(量角器,茉莉)
EN

Stack Overflow用户
提问于 2017-02-17 02:08:53
回答 3查看 5.7K关注 0票数 8
代码语言:javascript
复制
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()是如何工作的吗?这是做什么用的?我用谷歌搜索了一下,但找不到任何对我来说足够容易理解的信息。我正在用测角器和茉莉花自动化。请考虑上面的代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-21 06:37:25

如果您的测试在测试的控制流中创建了并行TaskQueue,则需要使用done (阅读有关promises and control flow的更多信息)。

例如:

代码语言:javascript
复制
describe('Control Flow', function() {
    function logFromPromise(text) {
        var deferred = protractor.promise.defer();
        deferred.then(function() {
            console.log(text);
        });
        deferred.fulfill();
        return deferred;
    }

    it('multiple control flows', function() {
        setTimeout(function() {
            logFromPromise('1');
        });
        logFromPromise('0');
    });
}

调用setTime会在控件中创建一个并行任务队列:

代码语言:javascript
复制
ControlFlow
| TaskQueue
| | Task<Run fit("multiple control flows") in control flow>
| | | TaskQueue 
| | | | Task <logFromPromise('0');>
| TaskQueue
| | Task <setTimeout>

量角器认为在打印0之后测试已经“完成”。在本例中,1可能会在测试完成后打印出来。要让量角器等待完成,需要调用Task <setTimeout>函数:

代码语言:javascript
复制
    it('multiple control flows', function(done) {
        setTimeout(function() {
            logFromPromise('1').then(function() {
                done();
            });
        });
        logFromPromise('0');
    });

如果可以,当测试“完成”时,让量角器处理。拥有并行TaskQueues可能会在测试中导致意外的争用情况。

票数 7
EN

Stack Overflow用户

发布于 2017-02-17 14:54:33

下面是一个示例describe,您可以运行该示例并查看发生的情况。我不得不提一下,我不使用Protractor,所以关于它的特定功能可能会有一些额外的考虑因素。

代码语言:javascript
复制
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();
        });
    });
});

在运行测试时,您将注意到顺序: first promises #1,#2,#3将被逐个创建和解析。请注意,#1和#2的期望还不会运行,因为promises是异步解析的。

然后,由于#3测试使用done,在创建#3Promise之后,将评估所有先前promise的预期函数:您将看到'#1 then...‘。和“#2期望...”,但是jasmine不会关心这一点,因为测试#1和#2已经完成了,并且与它们相关的一切都已经完成了。只有在这些#3期望做出之后,它才会真正失败,因为在done()产生之前,jasmine确实会处理所有发生的事情。

然后,您可以观看#4测试正常流程--创建承诺、解决方案、期望,所有由jasmine考虑的事情,因此期望将真正通过。

票数 2
EN

Stack Overflow用户

发布于 2019-02-01 14:42:00

我还没用过量角器。对于Jasmine,我的理解是doneJasmine等待,但不是传统意义上的超时。它不像一个总是在运行的计时器。我认为doneJasmine中扮演着检查点的角色。当Jasmine发现某个规范使用了done时,它知道除非运行了包含done的代码段,否则它不能继续下一步(比如运行下一个规范或将此规范标记为已完成,即声明当前规范的裁决)。

例如,jasmine通过了这个规范,即使它应该失败,因为它不等待setTimeout被调用。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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.
  });

总之,把done想象成告诉Jasmine -“我现在完成了”或者“当这段代码命中时我就会完成”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42281591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档