簡體   English   中英

使用Mocha和Promise測試Node.js

[英]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.');
  }
})

那是因為您不能同時調用resolvereject 如果top.error == 'conflict'這種情況。

如何使用此函數的返回值?

為了進行測試,您可以將mochachaiproi- promise一起使用。 您的測試可能如下所示(使用chaichai-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM