簡體   English   中英

如何使用Mocha單元測試node.js功能?

[英]How can I unit test node.js functions with Mocha?

我正在嘗試測試一個看起來像這樣的函數:

function sendVerifySms(patientId, data) {
    var smsNumber = data.smsNumber;
    var verifyCode = ((Math.random() * 1000000) | 0).toString();

    var sql = "UPDATE [patient]";
    sql += " SET phone_sms_verify_code = '" + verifyCode + "',";
    // verification must take place within a one hour period
    sql += " phone_sms_verify_code_expire = '" + moment.utc().add(1, 'hour').formatSqlDatetime() + "',";
    sql += " phone_sms_verified = 0,"
    sql += " phone_sms = '" + escapeSql(smsNumber) + "'";
    sql += " WHERE id = " + escapeSql(patientId.toString());

    return sqlServer.query(sql).then(function(result) {
        twilioClient.sendMessage({
            to: smsNumber,
            from: twilioUser.verifyNumber,
            body: verifyCode
        }).then(function(res) {
            console.log('sent verification');
            return verifyCode;
        }).fail(function(err) {
            console.log('error sending verification');
            console.log(err);
            return err;
        });
    }).fail(function(err) {
        console.log(err);
        return err;
    });
}

很容易,對吧? 好吧,首先,我需要確定要測試的對象。

  1. sql命令與給定data的格式匹配
  2. 已經調用了twilioClient.sendMessage

到目前為止,這是我要進行的測試:

var should = require('should');
var methods;
var mockery = require('mockery');
var sinon = require('sinon');

describe('RPC Methods', function() {
    before(function() {
        mockery.enable();
        mockery.registerMock('msnodesql', {
            open: function() {
                return true;
            }
        });

        mockery.registerMock('../../db/sqlserver', {
            query: function() {
                return {
                    then: function() {
                        return true;
                    }
                }
            }
        });

        methods = require('../../../rpc/methods');
    });

    it('should send a verify SMS', function() {
        var data = {

        }

        methods.sendVerifySms(1, data);
        should(1).equal(1);
    });
});

所以現在我從這里有點迷路了。 我有大量的require並且由於我想隔離我的各個功能進行測試,所以我發現像mockery東西會起作用。 我從這里去哪里?

如果有任何不清楚的地方,請發表評論,我會澄清。

謝謝!

使用mocha測試,您可以有一個可選的done回調,它使測試異步功能更加容易,如下所示:

it('should send a verify SMS', function(done) {
    var data = {};
    var code = 1;
    methods.sendVerifySms(code, data)
        .then(function(actualCode) {
            should(actualCode).equal(code);
            done();
        });
});

對於要測試的異步功能,我也會提供一些反饋。 首先,我要說的是您不必像以前那樣嵌套承諾鏈,在這種情況下,您最好不要這樣做。 如果僅從promise回調中返回promise,則可以在同一級別將其鏈接,如下所示:

return sqlServer.query(sql).then(function(result) {
    return twilioClient.sendMessage({
        to: smsNumber,
        from: twilioUser.verifyNumber,
        body: verifyCode
    });
}).then(function(res) {
    console.log('sent verification');
    return verifyCode;
}).fail(function(err) {
    console.log(err);
    throw err;
});

其次,在錯誤處理程序中,您只需要簡單地返回err。 這可能是一個壞主意,因為它告訴消費者您的承諾是一切都是笨拙的,並且應照此進行。 另一方面,引發錯誤將使該使用者可以在自己的.fail塊中處理所需的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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