2016-07-06 56 views
0

我有以下承諾。我知道他們工作正常,因爲funcThree中的console.log輸出返回正確的數據。我如何通過測試證明這一點?來自承諾的測試返回值chai

基本上,我該如何測試這個承諾?我試圖在下面進行測試,但無論我放在那裏(包括expect(false).to.be.true),它總是返回true。我不相信它實際上達到了預期的表述。

CODE

let number = 0; 
let count = 0; 

// Find Mongoose document 
function funcOne(query) { 
    return new Promise(function (resolve, reject) { 
    MongooseDocument.find(query) 
     .exec(function (err, results) { 
     if (err) { 
      reject(err); 
     } 
     resolve(results); 
     }); 
    }); 
} 

// Iterate over each document and adjust external value 
function funcTwo(documents) { 
    return new Promise(function (resolve, reject) { 
    _.each(documents, function (document) { 
     count += 1; 
     number += document.otherNumber; 
    }); 
    if (count >= documents.length) { 
     resolve({ 
     count, 
     number, 
     }); 
    } 
    }); 
} 

// Chain promises and return result 
function funcThree(query) { 
    return funcOne(query).then(funcTwo).then(function (result) { 
    console.log("=================="); 
    console.log(result); 
    return result; 
    }); 
} 

測試例

// The expect test below never runs! How do I test this promise? Or 
// better yet, how do I get the value returned as a result from the 
// promise to test that? 
it('should return an object', function() { 
    funcThree(query).then(function(result) { 
    return expect(result).to.be.an('object'); 
    }); 
}); 

回答

0

當使用chaichai-as-promised您需要指示薛寶釵實際使用chai-as-promised

var chai = require('chai'); 
chai.use(require('chai-as-promised'); 

還以斷言轉換爲回報您需要使用關鍵字eventually一個承諾,你需要返回的承諾回it()。在使用chai-as-promised時,您需要針對實際承諾返回功能執行斷言,在這種情況下,需要執行funcThree(query)。這就是爲什麼你總是讓你的測試功能恢復正常,你實際上並沒有等待Promise解決,並且因爲沒有錯誤發回到你的it()那麼它就被認爲是成功的。所以,你的測試上面的例子應該如下:

it('should return an object', function() { 
    return expect(funcThree(query)).to.eventually.be.a('object'); 
}); 

您也可以使用下面的語法

it('should return an object', function() { 
    var funcThreePromise = funcThree(query); 

    // Promise below is whatever A+ Promise library you're using (i.e. bluebird) 
    return Promise.all([ 
    expect(funcThreePromise).to.eventually.be.fulfilled, 
    expect(funcThreePromise).to.eventually.be.a('object') 
    ]); 
}); 
使對同樣的承諾多斷言