2013-05-16 15 views
0

我在這裏做錯了什麼?我有一段代碼,看起來是這樣的:爲什麼我的Q鏈接承諾拒絕行爲不符合我的期望?

function getUserList(requestingUserId){ 
    return customerRepo.getCustomersAllowedByUser(requestingUserId) 
    .then(function(customers){ 
    return userRepo.getUserList({customers: customers}); 
    }); 
} 

我的倉庫代碼掐滅這樣的:

customerDeferred = q.defer(); 
userDeferred = q.defer(); 

customerRepository.getCustomersAllowedByUser = sinon.stub().returns(customerDeferred.promise); 
userRepository.getUsers = sinon.stub().returns(userDeferred.promise); 

這一切工作正常時,這兩個承諾都解決了,並如預期,當我拒絕客戶承諾,但是當我解決客戶承諾並拒絕用戶許諾時,測試就會失敗。下面是測試:

it('should forward the rejection when userRepository rejects the promise', function(done){ 
    var rejectionError = new Error("test"); 
    var receivedError; 

    userServices.getUserList(1) 
    .then(null, function(error){ 
    receivedError = error; 
    }) 
    .fin(function(){ 
    receivedError.should.equal(rejectionError); 
    done(); 
    }); 

    customerDeferred.resolve(customerList); 
    userDeferred.reject(rejectionError); 
}); 
+0

它是如何分解的? – loganfsmyth

回答

1

,看看有什麼錯,只有暫時代替你的測試:

var rejectionError = new Error("test"); 
var receivedError; 

userServices.getUserList(1).done(); 

customerDeferred.resolve(customerList); 
userDeferred.reject(rejectionError); 

這將打印出實際的錯誤。一旦你修復了錯別字所導致的所有錯誤,你就會發現它的工作原理。

問題是userRepo不同於userRepository而不同於getUserList

有固定的這一切我結束了:

var q = require('q') 
var sinon = require('sinon') 

var assert = require('assert') 

customerDeferred = q.defer(); 
userDeferred = q.defer(); 

var customerList = [] 
var customerRepo = {} 
var userRepo = {} 

customerRepo.getCustomersAllowedByUser = sinon.stub().returns(customerDeferred.promise); 
userRepo.getUsers = sinon.stub().returns(userDeferred.promise); 

function getUserList(requestingUserId){ 
    return customerRepo.getCustomersAllowedByUser(requestingUserId) 
    .then(function(customers){ 
    return userRepo.getUsers({customers: customers}); 
    }); 
} 

var rejectionError = new Error("test"); 
var receivedError; 

getUserList(1) 
.then(null, function(error){ 
    receivedError = error; 
}) 
.fin(function(){ 
    assert.equal(receivedError, rejectionError); 
    console.log('DONE') 
}); 

customerDeferred.resolve(customerList); 
userDeferred.reject(rejectionError); 

哪個完美運行。

+0

是的,我發佈後就明白了。感謝提示.done() –