javascript – res.status在尝试设置状态代码时不是一个函数
作者:互联网
当试图满足由提供的单元测试设置的规范时,在尝试返回我遇到的方法的状态代码时
TypeError: res.status is not a function
在API实现中运行createUser函数时.它发生在每个方法调用中,例如res.send,res.sendStatus等.即使我将res.status()添加到测试以将其设置在那里,它也会返回相同的错误.
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.statusCode:
expect(res.statusCode).to.equal(201);
在您的模拟对象上也不存在.虽然res.status()是Express中的内置功能,但res.statusCode不是文档属性(尽管它确实存在).
你可以像这样添加到你的模拟res对象:
let res = {
end: function(){}
status: function(s) {this.statusCode = s; return this;}
};
让它通过这两个测试.
标签:javascript,node-js,mocha,sinon 来源: https://codeday.me/bug/20190823/1698406.html