Bcrypt.compare 未在 chai/mocha 测试中执行,但在代码中执行
Bcrypt.compare not executing in chai/mocha tests, but executing in code
我的项目中有一些 node.js 后端。我使用 bcrypt 加密密码。为了将请求中的字符串密码与数据库中的哈希密码进行比较,我使用了 bcrypt.compare 函数。我的 bcrypt.compare 函数在代码中运行良好。我用 Postman 手动测试了它,它在生产环境中运行良好。但是在 chai-http 和 mocha 的测试中它挂断了。
测试。我使用 mocha 和 chai-http 来制作 http POST 请求:
describe('Testing login', () => {
it('should return status 200 when there is such user in DB and password is correct', (done) => {
chai.request(server)
.post('/login')
.send({
login: 'test@test.test',
password: 'somepassword'
})
.end((err, res) => {
res.should.have.status(200)
done()
})
})
})
控制器 bcrypt 函数看起来像这样:
async function auth (req, res) {
let { login, password } = req.body
try {
let payload = {}
let result = {}
await
User.findOne({ where: { userEmail: login } }).then(user => {
return result = user
})
bcrypt.compare(password, result.dataValues.password, await function (err, data) {
if (err) {
throw Error(err)
}
if (result && data) {
payload.isAdmin = result.dataValues.isAdmin
payload.ID = result.dataValues.id
let token = jwt.sign(payload, 'yoursecret')
res.status(200).send({ token: token })
} else { res.status(401) }
})
} catch (error) {
res.sendStatus(500)
}
}
有什么方法可以测试这个功能吗?
附加信息
摩卡版本 5.2.0 - 全局和本地
节点 v8.11.4
windows 10 x64
"devDependencies": {
"@types/chai-as-promised": "^7.1.0",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"chai-http": "^4.2.0",
"eslint": "^5.5.0",
"eslint-config-standard": "^12.0.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-node": "^7.0.1",
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^4.0.0",
"express-unit": "^2.1.1",
"mocha": "^5.2.0",
"mock-express-request": "^0.2.2",
"mock-express-response": "^0.2.2",
"nyc": "^13.0.1",
"proxyquire": "^2.1.0",
"sinon": "^6.2.0",
"supertest": "^3.3.0",
"ws": "3.3.2"
}
我相信有一些问题,还有一些地方可以寻找资源。我不认为这是 chai-http
.
的问题
MDN async/await
functions
Using bcrypt
with Promises.
这是您的路由处理程序的重写版本:
async function auth(req, res) {
let {
login,
password
} = req.body
try {
let payload = {}
let result = await User.findOne({
where: {
userEmail: login
}
});
const data = await bcrypt.compare(password, result.dataValues.password);
if (result && data) {
payload.isAdmin = result.dataValues.isAdmin
payload.ID = result.dataValues.id
let token = jwt.sign(payload, 'yoursecret')
res.status(200).send({
token: token
})
} else {
res.sendStatus(401)
}
} catch (error) {
res.sendStatus(500)
}
}
我不确定你是如何设置你的路由的,但一个常见的错误是没有正确处理异步函数,as express
doesn't do this for you.
如果有帮助请告诉我。查看您如何初始化路由以及您使用的 Node、Express、chai-http、bcrypt 和 jsonwebtoken 的版本也会很有帮助。
错误行为与 chai/mocha/bcript 无关。这是由以下语句引起的
} else {
res.status(401)
}
正确的代码应该是
} else {
res.status(401).send(something)
}
或
} else {
res.sendStatus(401)
}
我认为 Express 在 .status() 之后等待 .send() 并保持连接没有响应
我的项目中有一些 node.js 后端。我使用 bcrypt 加密密码。为了将请求中的字符串密码与数据库中的哈希密码进行比较,我使用了 bcrypt.compare 函数。我的 bcrypt.compare 函数在代码中运行良好。我用 Postman 手动测试了它,它在生产环境中运行良好。但是在 chai-http 和 mocha 的测试中它挂断了。
测试。我使用 mocha 和 chai-http 来制作 http POST 请求:
describe('Testing login', () => {
it('should return status 200 when there is such user in DB and password is correct', (done) => {
chai.request(server)
.post('/login')
.send({
login: 'test@test.test',
password: 'somepassword'
})
.end((err, res) => {
res.should.have.status(200)
done()
})
})
})
控制器 bcrypt 函数看起来像这样:
async function auth (req, res) {
let { login, password } = req.body
try {
let payload = {}
let result = {}
await
User.findOne({ where: { userEmail: login } }).then(user => {
return result = user
})
bcrypt.compare(password, result.dataValues.password, await function (err, data) {
if (err) {
throw Error(err)
}
if (result && data) {
payload.isAdmin = result.dataValues.isAdmin
payload.ID = result.dataValues.id
let token = jwt.sign(payload, 'yoursecret')
res.status(200).send({ token: token })
} else { res.status(401) }
})
} catch (error) {
res.sendStatus(500)
}
}
有什么方法可以测试这个功能吗?
附加信息
摩卡版本 5.2.0 - 全局和本地
节点 v8.11.4
windows 10 x64
"devDependencies": {
"@types/chai-as-promised": "^7.1.0",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"chai-http": "^4.2.0",
"eslint": "^5.5.0",
"eslint-config-standard": "^12.0.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-node": "^7.0.1",
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^4.0.0",
"express-unit": "^2.1.1",
"mocha": "^5.2.0",
"mock-express-request": "^0.2.2",
"mock-express-response": "^0.2.2",
"nyc": "^13.0.1",
"proxyquire": "^2.1.0",
"sinon": "^6.2.0",
"supertest": "^3.3.0",
"ws": "3.3.2"
}
我相信有一些问题,还有一些地方可以寻找资源。我不认为这是 chai-http
.
MDN async/await
functions
Using bcrypt
with Promises.
这是您的路由处理程序的重写版本:
async function auth(req, res) {
let {
login,
password
} = req.body
try {
let payload = {}
let result = await User.findOne({
where: {
userEmail: login
}
});
const data = await bcrypt.compare(password, result.dataValues.password);
if (result && data) {
payload.isAdmin = result.dataValues.isAdmin
payload.ID = result.dataValues.id
let token = jwt.sign(payload, 'yoursecret')
res.status(200).send({
token: token
})
} else {
res.sendStatus(401)
}
} catch (error) {
res.sendStatus(500)
}
}
我不确定你是如何设置你的路由的,但一个常见的错误是没有正确处理异步函数,as express
doesn't do this for you.
如果有帮助请告诉我。查看您如何初始化路由以及您使用的 Node、Express、chai-http、bcrypt 和 jsonwebtoken 的版本也会很有帮助。
错误行为与 chai/mocha/bcript 无关。这是由以下语句引起的
} else {
res.status(401)
}
正确的代码应该是
} else {
res.status(401).send(something)
}
或
} else {
res.sendStatus(401)
}
我认为 Express 在 .status() 之后等待 .send() 并保持连接没有响应