2017-02-16 30 views
5
it('should for something', function check(done) { 
    browser.sleep(2000); 
    $('.csTx').isPresent().then(function(result) { 
    if(result) { 
     done(); 
    } else { 
     xPage.clickBack(); 
     check(done); 
    } 
    }) 
}, 30000); 

有人可以解释如何完成()的作品,这是什么。我搜索了它,但找不到任何足以让我理解的信息。我用量角器和茉莉自动化。请考虑上面的代码。做什么()是什么和如何使用它(量角器,茉莉花)

+2

这只是一个回调,表示完成这个规范。你会留在这个规范中,直到done()被调用。 – Gunderson

+0

@Gunderson--你能告诉我更多关于它的信息吗? – rafalf

回答

4

如果测试在测试的控制流中创建了并行TaskQueue,则需要使用done(详细了解promises and control flow)。

例如:

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调用在控制创建一个并行任务队列:

ControlFlow 
| TaskQueue 
| | Task<Run fit("multiple control flows") in control flow> 
| | | TaskQueue 
| | | | Task <logFromPromise('0');> 
| TaskQueue 
| | Task <setTimeout> 

量角器认为测试 “完成” 被打印0之后。在这个例子中,1可能会在测试完成后打印出来。为了使量角器等待Task <setTimeout>,你需要调用完成功能:

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

如果可以,让量角器手柄当测试“完成”。并行TaskQueues可能会导致测试中出现意外的竞争状况。

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将不会运行,因为承诺是异步解决的。

然后,因为#3测试使用done,在创建#3诺言后,评估所有先前承诺的功能then s:您会看到'#1期待...'和'#2期待...... ',但茉莉花不会在意这一点,因为测试#1和#2已经完成,并完成了有关他们的一切。只有在第三种期望得以实现之后,它才会真正失败,因为茉莉花会照顾在done()之前发生的所有事情。

然后你可以看#4测试正常流量 - 创造承诺,解决,期望,茉莉花考虑的一切,所以期望会真正通过。

+0

我认为量角器处理done()本身。这就是为什么规格运行的原因。但寻找一些信息,基本上量角器如何处理完成,当我应该,不应该使用它。感谢您的广泛响应 – rafalf

相关问题