尝试设置状态码时,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。