开玩笑地编写一个测试,将 属性 添加到响应 header
Write a test in jest for adding a property to the response header
我正在设置用户登录时的身份验证服务器; express 应该在响应中添加一个 属性 ('x-auth-token') header 实际有效的路由,但我不知道如何开玩笑地为此编写测试。
这是我的路由处理程序;
const bcrypt = require('bcrypt');
const { User } = require('../models/user');
const Joi = require('joi');
const express = require('express');
const router = express.Router();
router.post('/', async (req, res) => {
const { error } = validation(req.body);
if (error) return res.status(400).send(error.details[0].message);
const { email, password } = req.body;
const user = await User.findOne({ email });
if (!user || !(await bcrypt.compare(password, user.password)))
return res.status(400).send('Invalid email or password.');
// here express adding the token to header
res
.header('x-auth-token', user.generateAuthToken())
.send(JSON.stringify(`Welcome dear ${user.name}`));
});
function validation(value) {
const schema = {
email: Joi.string()
.min(10)
.max(255)
.email()
.required(),
password: Joi.string()
.min(8)
.max(1024)
.required()
};
return Joi.validate(value, schema);
}
module.exports = router;
这是我的测试:
用户在 MongoDB 中可用并且电子邮件和密码有效。
const request = require('supertest');
const execude = () => {
return request(server)
.post('/api/auth')
.send({ email, password });
};
it('should place token in x-auth-token if request is valid', async () => {
const res = await execude();
expect(res.header).to.haveKey('x-auth-token');
});
开玩笑控制台
● /auth › POST/ › should place token in x-auth-token if request is valid
expect(object).toHaveProperty(path)
Expected the object:
{"connection": "close", "content-length": "26", "content-type": "text/html; charset=utf-8", "date": "Mon, 29 Apr 2019 20:54:45 GMT", "etag": "W/\"1a-ARJvVK+smzAF3QQve2mDSG+3Eus\"", "strict-transport-security": "max-age=15552000; includeSubDomains", "x-content-type-options": "nosniff", "x-dns-prefetch-control": "off", "x-download-options": "noopen", "x-frame-options": "SAMEORIGIN", "x-xss-protection": "1; mode=block"}
To have a nested property:
"x-auth-token"
94 | const res = await execude();
95 |
> 96 | expect(res.header).toHaveProperty('x-auth-token');
| ^
97 | });
98 | // should send specific string if request is valid
99 | });
at Object.toHaveProperty (tests/integration/authentication.test.js:96:
这是您可以用来提供 post 请求 with/without 令牌的函数。您必须在服务器变量
中声明已部署的数据库 ip/address
/**
* Post request function.
* @param {String} endpoint - Endpoint to give post request.
* @param {String} token - Token to validate-optional.
* @param {Object} schema - Data to post.
* @return {} Returns body response and status code.
*/
async postRequest(endpoint, schema, token = 0) {
if (token === 0) { return await request(server).post(endpoint).send(schema) }
else { return await request(server).post(endpoint).set('x-auth-token', token).send(schema) };
}
我正在设置用户登录时的身份验证服务器; express 应该在响应中添加一个 属性 ('x-auth-token') header 实际有效的路由,但我不知道如何开玩笑地为此编写测试。
这是我的路由处理程序;
const bcrypt = require('bcrypt');
const { User } = require('../models/user');
const Joi = require('joi');
const express = require('express');
const router = express.Router();
router.post('/', async (req, res) => {
const { error } = validation(req.body);
if (error) return res.status(400).send(error.details[0].message);
const { email, password } = req.body;
const user = await User.findOne({ email });
if (!user || !(await bcrypt.compare(password, user.password)))
return res.status(400).send('Invalid email or password.');
// here express adding the token to header
res
.header('x-auth-token', user.generateAuthToken())
.send(JSON.stringify(`Welcome dear ${user.name}`));
});
function validation(value) {
const schema = {
email: Joi.string()
.min(10)
.max(255)
.email()
.required(),
password: Joi.string()
.min(8)
.max(1024)
.required()
};
return Joi.validate(value, schema);
}
module.exports = router;
这是我的测试:
用户在 MongoDB 中可用并且电子邮件和密码有效。
const request = require('supertest');
const execude = () => {
return request(server)
.post('/api/auth')
.send({ email, password });
};
it('should place token in x-auth-token if request is valid', async () => {
const res = await execude();
expect(res.header).to.haveKey('x-auth-token');
});
开玩笑控制台
● /auth › POST/ › should place token in x-auth-token if request is valid
expect(object).toHaveProperty(path)
Expected the object:
{"connection": "close", "content-length": "26", "content-type": "text/html; charset=utf-8", "date": "Mon, 29 Apr 2019 20:54:45 GMT", "etag": "W/\"1a-ARJvVK+smzAF3QQve2mDSG+3Eus\"", "strict-transport-security": "max-age=15552000; includeSubDomains", "x-content-type-options": "nosniff", "x-dns-prefetch-control": "off", "x-download-options": "noopen", "x-frame-options": "SAMEORIGIN", "x-xss-protection": "1; mode=block"}
To have a nested property:
"x-auth-token"
94 | const res = await execude();
95 |
> 96 | expect(res.header).toHaveProperty('x-auth-token');
| ^
97 | });
98 | // should send specific string if request is valid
99 | });
at Object.toHaveProperty (tests/integration/authentication.test.js:96:
这是您可以用来提供 post 请求 with/without 令牌的函数。您必须在服务器变量
中声明已部署的数据库 ip/address /**
* Post request function.
* @param {String} endpoint - Endpoint to give post request.
* @param {String} token - Token to validate-optional.
* @param {Object} schema - Data to post.
* @return {} Returns body response and status code.
*/
async postRequest(endpoint, schema, token = 0) {
if (token === 0) { return await request(server).post(endpoint).send(schema) }
else { return await request(server).post(endpoint).set('x-auth-token', token).send(schema) };
}