编程语言
首页 > 编程语言> > javascript – res.status在尝试设置状态代码时不是一个函数

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