[英]testing node.js using mocha and promises
我正在構建一個使用CouchDB作為后端的API,並且在構建后端庫的同時,我想在庫中創建一個函數以添加用戶帳戶並返回成功或失敗,但是回調引起了問題。
在閱讀了JS Promises之后,我意識到這些可以解決我的問題,但是盡管閱讀了很多教程,但我無法使它們工作。
您能否看一下我的代碼並幫助我理解為什么它不起作用?
var request = require('request');
var md5 = require('MD5');
var crypto = require('crypto');
var Q = require('q');
exports.new_account = function(params) {
console.log("\nNEW_ACCOUNT")
params.password = md5(params.password);
//console.log(params);
var token = crypto.randomBytes(16).toString('hex');
var record = {
type:"user",
status:"pending",
token:token,
credentials:params
};
console.log(record);
var uri = 'http://127.0.0.1:5984/testdb/'+params.email;
var deferred = Q.defer();
request({method: 'PUT', uri:uri, body: JSON.stringify(record)}, function (error, response, body) {
console.log('performing request')
var top = JSON.parse(body);
console.log(top);
if (top.error == 'conflict') {
console.log('the supplied email address already exists');
deferred.reject('account exists!');
}
console.log('resolving request')
deferred.resolve('account added.');
})
//var res = {status:"success", message:"Account created"};
return deferred.promise;
}
謝謝,
首先,我認為您的請求的回調函數應如下所示:
function (error, response, body) {
console.log('performing request');
var top = JSON.parse(body);
console.log(top);
if (top.error == 'conflict') {
console.log('the supplied email address already exists');
deferred.reject('account exists!');
} else {
console.log('resolving request');
deferred.resolve('account added.');
}
})
那是因為您不能同時調用resolve
和reject
。 如果top.error == 'conflict'
這種情況。
如何使用此函數的返回值?
為了進行測試,您可以將mocha與chai和proi- promise一起使用。 您的測試可能如下所示(使用chai
和chai-as-promised
promise很有幫助):
var chai = require('chai'),
chaiAsPromised = require("chai-as-promised"),
assert;
chai.use(chaiAsPromised);
assert = chai.assert;
describe('user', function () {
describe('.new_account', function () {
afterEach(function (done) {
done();
});
it("status should be success", function () {
var params = {name: "John Doe", email: "test@gmail.com", password: "p455w0rd"};
var promise = user.new_account(params);
var expectedResult = 'account added.';
//the first time, the account should be created successfully.
return assert.becomes(promise, expectedResult, 'account added.');
});
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.