摩卡如何测试if else语句?

时间:2014-01-29 05:51:04

标签: node.js if-statement mocha

我在尝试为Node.js中的if else语句编写Mocha测试时遇到问题。以下是正在测试的内容:

exports.restrict = function(req, res, next) {
    if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
    }
}

这就是我试图测试它的方式:

describe('interface', function(){        
it('should show ability to asynchronously deny a user with an incorrect password', function(done){
        function restrict (req, res, next){
            if (req.session.user) {
                next();
                done();
            } else {
                req.session.error.should.equals('Access denied'); 
                req.redirect.should.equals('/login'); 
                done();
            }
        }
    });
});

运行测试时收到的错误是它超时,因为它超过2000毫秒。我做错了什么?

2 个答案:

答案 0 :(得分:1)

在测试中,您定义了一个永远不会被调用的restrict函数,因此永远不会调用done并且测试会超时。这就是你做错了。在Mocha测试中使用if... else没什么特别的。

更广泛的问题:您在问题中显示的内容表明您将模块的代码复制到测试套件中。这是测试代码的可怕方法。您应该构建模块,以便测试套件能够在不重复代码的情况下运行其功能。

答案 1 :(得分:1)

是的,测试文件中的语句不正确。阅读您的源文件,我们有两种方案来检查restrict函数。

  1. 如果存在用户会话,请检查是否调用了next()
  2. 如果用户会话不存在,请检查是否调用了redirect()并分配了req.session.error

基于最前面的项目符号,我们可以设计测试,例如

const sinon = require('sinon');
const chai = require('chai');
const assert = chai.assert;

const src = require('./src');

describe('interface', function () {
  it('calls next() if user session exist', function () {
    const next = sinon.spy();
    const res = sinon.spy();
    const req = {
      session: {
        user: 'username' // set user session
      }
    }

    src.restrict(req, res, next);    

    assert(next.called);
  });

  it('redirects if user session not exist', function () {
    const next = sinon.spy();
    const res = {
      redirect: sinon.spy()
    }
    const req = {
      session: {}      
    }

    src.restrict(req, res, next);    

    assert.equal(req.session.error, 'Access denied!');
    assert(res.redirect.calledWith('/login'));

    assert.isFalse(next.called)
  });
});

我们不需要使用done(),因为restrict()不是异步函数。 我们还在此处使用sinon监视reqresnext变量。

参考:  -https://sinonjs.org/

希望有帮助。