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

raf*_*alf 6 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);
Run Code Online (Sandbox Code Playgroud)

有人可以解释done()的工作原理以及它的用途.我用谷歌搜索了它,但找不到任何容易让我理解的信息.我正在使用量角器和茉莉花进行自动化.请考虑以上代码.

Dan*_*ber 5

done如果测试在测试的控制流中创建并行的TaskQueue,则需要使用(请阅读有关promises和控制流的更多信息).

例如:

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');
    });
}
Run Code Online (Sandbox Code Playgroud)

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

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

量角器认为测试在0打印后"完成" .在此示例中,1可能会在测试完成后打印.要使量角器等待Task <setTimeout>,您需要调用done函数:

    it('multiple control flows', function(done) {
        setTimeout(function() {
            logFromPromise('1').then(function() {
                done();
            });
        });
        logFromPromise('0');
    });
Run Code Online (Sandbox Code Playgroud)

如果可以,请在测试"完成"时让量角器处理.并行TaskQueues可能会导致测试中出现意外的竞争条件.