2017-02-16 52 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