【问题标题】:How can I unit test node.js functions with Mocha?如何使用 Mocha 对 node.js 函数进行单元测试?
【发布时间】:2015-05-14 01:13:10
【问题描述】:

我正在尝试测试一个看起来像这样的函数:

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 这样的东西会起作用。我从这里去哪里?

如果有什么不清楚的地方,请发表评论,我会澄清的。

谢谢!

【问题讨论】:

    标签: node.js unit-testing mocking mocha.js


    【解决方案1】:

    使用 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;
    });
    

    其次,在您简单地返回错误之前的错误处理程序中。这可能是一个坏主意,因为它告诉消费者你的承诺,一切都是笨拙的,他们应该这样做。另一方面,抛出错误将允许消费者在他们自己的.fail 块中处理错误。

    【讨论】:

    • 但我没有测试回报的价值。试图进行间谍活动
    猜你喜欢
    • 2014-04-01
    • 2012-07-10
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2017-06-09
    • 2019-05-24
    • 1970-01-01
    相关资源
    最近更新 更多