2017-08-03 123 views
0

我試圖測試一個接受作爲參數承諾的方法,但這個承諾永遠不會解決! 代碼:延遲測試承諾

function blockQueueUntilResolved (aPromise) { 
    aPromise.finally(releaseBlock) 
    queueBlocked = true 
} 

function releaseBlock() { 
    // other things.. 
} 

測試:

describe('given ...', function() { 
    var initDefer 
    var initPromise 
    var fn1 
    var fn2 
    var promise1Resolved = false 
    var promise2Resolved = false 

    it('queueBlocked is set to true', function() { 
    // initDefer = $q(function (resolve) { 
    // initPromise = resolve 
    // }) 
    initDefer = $q.defer() 
    // initPromise = initDefer.promise 

    fn1 = function() { 
     console.log('fn1 called') 
     promise1Resolved = true 
    } 

    fn2 = function() { 
     console.log('fn2 called') 
     promise2Resolved = true 
    } 

    QueueService.blockQueueUntilResolved(initDefer.promise) 
    QueueService.push(fn1) 
    QueueService.push(fn2) 

    expect(QueueService.isBlocked()).to.be.true 
    }) 

    it('promises in the queue are not processed', function() { 
    expect(promise1Resolved).to.be.false 
    expect(promise2Resolved).to.be.false 
    }) 

    describe('when the blocked promise is resolved', function() { 
    it('resolve', function() { 
     // initPromise() 
     initDefer.resolve() 
    }) 

    it('promises in the queue are processed', function() { 
     expect(promise1Resolved).to.be.true 
     expect(promise2Resolved).to.be.true 
    }) 
    }) 
}) 

我都嘗試戰略承諾,與延遲以及與此構造,但沒有工作。 promise1Resolvedpromise2Resolved始終爲false,並且不會調用相關日誌。 怎麼回事?

回答

0

好的,問題是在角度本身。 $q服務取決於$digest服務,因此承諾在調用摘要之前不會被解析。

修復的方法是:

describe('given ...', function() { 
    var initDefer 
    var fn1 
    var fn2 
    var promise1Resolved = false 
    var promise2Resolved = false 

    it('queueBlocked is set to true', function() { 
    initDefer = $q.defer() 

    fn1 = function() { 
     console.log('fn1 called') 
     promise1Resolved = true 
    } 

    fn2 = function() { 
     console.log('fn2 called') 
     promise2Resolved = true 
    } 

    QueueService.blockQueueUntilResolved(initDefer.promise) 
    QueueService.push(fn1) 
    QueueService.push(fn2) 

    expect(QueueService.isBlocked()).to.be.true 
    // make some assertions 
    expect(promise1Resolved).to.be.false 
    expect(promise2Resolved).to.be.false 

    initDefer.resolve() 
    // call the $digest 
    $rootScope.$digest() 
    // now the promise is resolved 

    expect(promise1Resolved).to.be.true 
    expect(promise2Resolved).to.be.true 
    }) 
}) 

你可以找到更多信息here