javascript - 在 Mocha 中使用 async/await - 测试挂起或以未处理的 promise 拒绝结束

标签 javascript node.js unit-testing mocha.js chai

运行非常简单的测试,我在基本授权 header 中传递无效凭据,我希望服务器返回 401

const request = require('request-promise');
const expect = require('chai').expect;
const basicToken = require('basic-auth-token');

describe('PUT Endpoint', function () {
 it.only('should return unauthorized if basic token is incorrect', async function (done) {
                let options = {
                    url: `http://url_to_handle_request`,
                    resolveWithFullResponse: true,
                    headers: {
                        Authorization: `Basic ${basicToken('INVALID', 'CREDENTIALS')}`
                    }
                };

                try {
                    await request.put(options); // this should throw exception
                } catch (err) {
                    expect(err.statusCode).to.be.equal(401); // this is called
                }
                done();
            });
});

此代码的问题在于 expect 子句解析为 false(因为服务器响应例如 403)并且测试以错误结束:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: expected 403 to equal 401

如果我省略 done 回调,测试就会挂起(名称为红色)并且显然是在“等待”某事完成 enter image description here

我知道如果我将它重写为使用标准的 promise 方法,它就会起作用。我只是好奇如何通过 async/await 做到这一点。

谢谢

最佳答案

从参数(以及函数体)中删除 done,然后 Mocha 将期望您返回 Promise。

异步函数默认返回 promise 。

如果您不抛出错误,它会返回已解决的 promise 。

关于javascript - 在 Mocha 中使用 async/await - 测试挂起或以未处理的 promise 拒绝结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49693562/

相关文章:

Javascript - 动态改变绝对定位

javascript - 如何选择未选中的复选框而不是不确定状态的复选框

javascript - 一个 JS 文件中的多个 keyup 事件

javascript - 在 Socket.io 中创建房间

mysql - 连接 mySQL 和 Nodejs

PHPUnit 模拟抛出不兼容的声明错误

Javascript unicode字符串,中文字符但没有标点符号

javascript - 使用 Jasmine 测试套件测试点击事件

unit-testing - 带服务的单元测试 Grails

node.js - 如何将 server/app.js 包含在 webpack-dev-server 中?