你会如何测试这条路线代码?

时间:2015-06-14 10:56:44

标签: javascript node.js unit-testing express sequelize.js

我有以下路线代码。 Usersequelize模型,jwt用于创建JWT令牌。

我想避免访问db,所以我想要删除两个依赖项。

User.create返回一个Promise。我希望能够断言res.json实际上是被调用的。我认为我的模拟User.create应该返回一个真正的承诺并实现这个承诺。

我想断言res.json被调用。我的测试方法在Promise完成之前退出。我没有从我的路线返回Promise,因此在我的测试中我无法从it返回。

鉴于我想嘲笑依赖项,请告诉我你将如何测试它?

如果您有关于如何更好地构建此代码的建议,请告诉我们。

module.exports = function(User, jwt) {
  'use strict';

  return function(req, res) {
    User.create(req.body)
    .then(function(user) {
      var token = jwt.sign({id: user.id}); 
      res.json({token: token});
    })
    .catch(function(e) {
    });
  };
};

1 个答案:

答案 0 :(得分:1)

我创建了一些用于模拟的文件:User,jwt,还为您的路由和测试本身创建了两个附加组件。

你可以看到here所有文件,如果你想运行,你需要先安装mocha和q:

npm install mocha
npm install q

并且运行:mocha

所以我创建了一个名为res的对象,并添加了一个名为json的方法,所以当从你的代码调用这个json方法时,我们就会知道测试已经过了。

var jwt = require('./jwt.js');
var User = require('./user.js');
var route = require('./route.js');

describe('Testing Route Create User', function () {
  it('should respond using json', function (done) {
    var user = {
      username: 'wilson',
      age: 29
    };

    var res = {};
    var req = {};
    var routeHandler = route(User, jwt);

    req.body = user;

    res.json = function (data) {
      done();
    }

    routeHandler(req, res);
  });
});
路径变量代表您的模块, routeHandler 是具有接口功能(req,res)的函数,该函数由你的模块。