尝试设置状态码时,res.status不是一个函数

当试图满足由所提供的unit testing设置的规范时,当试图返回一个方法的状态代码,我碰到

TypeError:res.status不是一个函数

在API实现中运行函数createUser时。 它发生在每个方法调用中,比如res.send,res.sendStatus等。即使我将res.status()添加到testing中来设置它,它也会返回相同的错误。

apiTests.js

let chai = require('chai'); let expect = chai.expect; let sinon = require('sinon'); let sinonChai = require('sinon-chai'); chai.use(sinonChai); let model = require('../tron_model.js'); // for stubbing only let api = require('../tron_api.js'); describe('API', function() { describe('creating users', function() { it('should return 201 on creating user', function () { let mockModel = sinon.stub(new model.TronModel()); mockModel.addUser.onFirstCall().returns(new model.User('user','pass')); let req = {body: {username: 'goatzilla', password: 'x'}}; let res = {end: function(){}}; api.init(mockModel); api.createUser(req, res); expect(res.statusCode).to.equal(201); expect(mockModel.addUser).to.have.callCount(1); }); }); }); 

tron_api.js

 let model = undefined; let api = exports; api.init = function(modelArg) { model = modelArg; }; api.createUser = function(req, res) { model.addUser(req.body.username, req.body.password); console.log(res); res.status(201); }; 

你用这个代码嘲笑了一个res对象:

 let res = {end: function(){}}; 

没有.status()方法,然后将其传递给您的api.createUser()函数,该函数预计调用res.status() (不在您的res.status()对象上的方法)。 一个模拟对象将需要有你的代码调用的每个方法。

另外,你也在用这个testing属性res.statusCode

 expect(res.statusCode).to.equal(201); 

这也不存在你的嘲笑的对象。 尽piperes.status()是Express中的一个内置function,但res.statusCode并不是一个logging的属性(虽然它确实存在)。

你可以像这样添加到你的模拟res对象:

 let res = { end: function(){} status: function(s) {this.statusCode = s; return this;} }; 

为了让它通过这两个testing。