2016-06-22 53 views
2

柴如許documentation狀態如下:在使用Chai作爲承諾時,我是否真的需要返回測試承諾?

Notice: either return or notify(done) must be used with promise assertions.

,並在網站上的例子如下:

return doSomethingAsync().should.eventually.equal("foo"); 

doSomethingAsync().should.eventually.equal("foo").notify(done); 

的東西是;我實際上是按照承諾寫了一個測試,但沒有返回諾言。像這樣:

it('should resolve user', function() { 
    $state.get(state).resolve.user(dataservice, { 
     userId: testUser.id 
    }).should.eventually.eq(testUser); 
    $rootScope.$apply(); 
    }); 

它工作得很好。我確信它會在測試失敗時將testUser更改爲其他內容。就像我預料的一樣。所以我不確定我在這裏做錯了什麼。

事實上,當我修改代碼以返回一個承諾時,它失敗了,出現錯誤「錯誤:超過2000ms的超時時間,確保在此測試中調用done()回調函數。修改後的代碼如下:

it('should resolve user', function() { 
    var promise = $state.get(state).resolve.user(dataservice, { 
     userId: testUser.id 
    }).should.eventually.eq(testUser); 
    $rootScope.$apply(); 
    return promise; 
    }); 

這裏有點困惑。這可能與Angular $ q有關。爲了說清楚,函數resolve.user返回$ q promise。

+0

不,你不應該。請參閱[this](http://stackoverflow.com/a/37374041/3731501)。 – estus

+0

'user(dataService,{...})'是否同步工作? (即它是否立即返回?) –

+0

@AtesGoral它工作異步。 – Bren

回答

2

在上述情況下,摩卡鏈返回承諾$rootScope.$apply()被調用後,所以鏈接then需要另一個$rootScope.$apply()才能執行。如果沒有這個,promise鏈的其餘部分不會執行並且會導致超時。

在Mocha規範中返回承諾適用於異步規範,這對於測試非角度承諾是必需的。 $q承諾是同步的,並與Angular摘要綁定。

here所示,chai-as-promised可以被修改,以支持$q承諾,並自動應用到$rootScope.$apply()斷言承諾:

chaiAsPromised.transferPromiseness = function (assertion, promise) { 
    assertion.then = promise.then.bind(promise); 

    if (!('$$state' in promise)) 
    return; 

    inject(function ($rootScope) { 
    if (!$rootScope.$$phase) 
     $rootScope.$digest(); 
    }); 
};