Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在node.js中为链接函数编写jest测试_Javascript_Node.js_Unit Testing_Express_Jestjs - Fatal编程技术网

Javascript 在node.js中为链接函数编写jest测试

Javascript 在node.js中为链接函数编写jest测试,javascript,node.js,unit-testing,express,jestjs,Javascript,Node.js,Unit Testing,Express,Jestjs,我有一个我想用jest测试的函数,该函数基本上执行一些令牌验证,并接受3个参数 这是我要测试的函数的de代码: const verifyToken = (req, res, next) => { // check header or url parameters or post parameters for token var token = req.headers['x-access-token'] if (!token) return res.status(4

我有一个我想用jest测试的函数,该函数基本上执行一些令牌验证,并接受3个参数

这是我要测试的函数的de代码:

const verifyToken = (req, res, next) => {
    // check header or url parameters or post parameters for token
    var token = req.headers['x-access-token']

    if (!token) return res.status(403).send({ auth: false, message: 'No token provided.' })

    // verifies secret and checks expire date
    jwt.verify(token, config.secret, (err, decoded) => {
        if (err) return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' })

        //put user inside req.user to use the user in other routes
        User.findById(decoded.id, (err, user) => {
            if (err) {
                return res.status(500).json({
                    message: err
                })
            } else if (!user) {
                return res.status(404).json({
                    message: 'No user found'
                })
            } else {
                req.user = user
            }
            next()
        })
    })
}
所以我正在编写第一个测试,测试de请求中是否没有给出令牌,它是否发送403和消息。下面是测试

const verifyToken = require('../../config/token')

describe('veryfiy token tests', () => {
    it('Should give 403 status when no token is present', () => {
        let mockReq = {
            headers: {}
        }
        var mockRes = {
            status: code => code
            send: message => message
        }

        let nextCalled = false

        let next = () => {
            nextCalled = true
        }

        expect(verifyToken(mockReq, mockRes, next)).toBe(403)
    })
})
现在,测试通过,但有一个错误: TypeError:res.status(…)。发送不是函数

当我在代码中从res.status中删除.send()时,测试通过

我一直在想如何在res对象上模拟status()和send()。但目前还没有找到解决办法


Tnx

我认为问题在于
res.status()
的结果没有名为
send()
的函数

尝试使用以下方法:

  var mockRes = {
    status: code => ({
      send: message => ({code, message})
    }),
  };
您应该能够通过以下方式进行测试:

  var result = verifyToken(mockReq, mockRes, next);
  expect(result.code).toBeDefined();
  expect(result.code).toBe(403);

PS:尚未测试代码:)

您可以创建链接的模拟类并进行测试,无论是否执行函数

这里有一个例子

  class MockResponse {
    constructor() {
    this.res = {};
     }
     status = jest
     .fn()
     .mockReturnThis()
     .mockImplementationOnce((code) => {
       this.res.code = code;
      return this;
     });
    send = jest
    .fn()
    .mockReturnThis()
    .mockImplementationOnce((message) => {
      this.res.message = message;
      return this;
    });
    }
现在使用这个模拟类进行测试。并检查给定函数是否以给定结果执行。 榜样

  it("should not call next function, and return 401, if token has not been found", async () => {
      let res = new MockResponse(); // here i initialised instance of class
      let  next = jest.fn();
      let req = {cookies:""} // header or cookies where you are receiving token here in my case empty.
       await authentication(req, res, next); // here i used my mock res class
      expect(next).not.toHaveBeenCalled(); // you must check that next will not be called. 
      expect(res.status).toHaveBeenCalledWith(401);//you can check result of status
      expect(res.send).toHaveBeenCalledWith("not authenticated");// send() message in your function
    });

这成功了!我不知道我必须嵌套函数。以tnx为例!