- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,两个对象 failApiClient
和 explicitFailApiClient
应该具有相同的类型,并且记录它们似乎是一致的:
console.log(failApiClient)//{ getObjects: [函数: getObjects] }
console.log(explicitFailApiClient)//{ getObjects: [Function: getObjects] }
阅读this问题为我提供了正确处理此问题所需的信息,但它没有告诉我为什么生成的 failApiClient
会导致警告,而 explicitFailApiClient
会导致警告不是。
我已将其减少到接近重现环境并演示可行替代方案所需的最低限度:
import * as sinon from 'sinon';
import 'source-map-support/register';
class LocalObject {
}
const fakeObject = new LocalObject();
const getFakeApi = (result: Promise<LocalObject[]>) = ({getObjects: () => result});
const successObjectClient = getFakeApi(Promise.resolve([fakeObject]));
// These should be equivalent, but the former causes a test error
const failApiClient = getFakeApi(Promise.reject(new Error()));
const explicitFailApiClient = {
getObjects(): Promise<LocalObject[]> {
return Promise.reject(new Error());
}
};
describe('successApiClient', () => {
before(() => {
sinon.spy(successObjectClient, 'getObjects');
});
it('does not have a warning', async () => {
// do nothing
});
});
describe('failApiClient', () => {
before(() => {
sinon.spy(failApiClient, 'getObjects');
});
it('should not have a warning', async () => {
// do nothing
});
});
describe('explicitFailApiClient', () => {
before(() => {
sinon.spy(explicitFailApiClient, 'getObjects');
});
it('does not have a warning', async () => {
// do nothing
});
});
以及 ~/...> tsc && npm test
的结果:
> internal-api@1.0.0 test /Users/./Projects/./node/internal-api
> grunt test
Running "test" task
Running "env:dev" (env) task
Running "simplemocha:unit" (simplemocha) task
(node:72101) UnhandledPromiseRejectionWarning: Error
at Object.<anonymous> (/Users/./Projects/./node/internal-api/src/test/unit/models/mvp.test.ts:21:57)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (/Users/./Projects/./node/internal-api/node_modules/coffee-script/lib/coffee-script/register.js:45:36)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at /Users/./Projects/./node/internal-api/node_modules/mocha/lib/mocha.js:222:27
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/Users/./Projects/./node/internal-api/node_modules/mocha/lib/mocha.js:219:14)
at Mocha.run (/Users/./Projects/./node/internal-api/node_modules/mocha/lib/mocha.js:487:10)
at Object.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt-simple-mocha/tasks/simple-mocha.js:29:20)
at Object.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/grunt/task.js:255:15)
at Object.thisTask.fn (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/grunt/task.js:73:16)
at Object.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:294:30)
at Task.runTaskFn (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:244:24)
at Task.<anonymous> (/Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:293:12)
at /Users/./Projects/./node/internal-api/node_modules/grunt/lib/util/task.js:220:11
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
at Function.Module.runMain (module.js:695:11)
at startup (bootstrap_node.js:191:16)
at bootstrap_node.js:612:3
(node:72101) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:72101) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
successApiClient
✓ does not have a warning
failApiClient
✓ should not have a warning
(node:72101) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)
explicitFailApiClient
✓ does not have a warning
3 passing (14ms)
Done.
最佳答案
它们并不等同。
在下面的代码中,当将语句 Promise.reject
作为参数放入时,JS 已经执行了该语句,这就是为什么您收到早期警告 UnhandledPromiseRejectionWarning
。
const failApiClient = getFakeApi(Promise.reject(new Error()));
比较
const explicitFailApiClient = {
getObjects(): Promise<LocalObject[]> {
return Promise.reject(new Error());
}
};
当调用 explicitFailApiClient.getObjects()
时,将评估其 Promise.reject
。
这是我针对此问题的替代解决方案。我可以使用Sinon 的resolves
和rejects
。
const getFakeApi = {getObjects: (result) => result};
const getFakeApiStub = sinon.stub(getFakeApi, 'getObjects');
describe('successApiClient', () => {
before(() => {
getFakeApiStub.resolves([fakeObject]); // success and resolves
});
it('does not have a warning', async () => {
// do nothing
});
});
describe('failApiClient', () => {
before(() => {
getFakeApiStub.rejects(new Error()); // make it failed
});
it('should not have a warning', async () => {
// do nothing
});
});
引用: https://sinonjs.org/releases/v6.3.5/stubs/#stubresolvesvalue
希望对你有帮助
关于javascript - 使用 sinon 时出现不一致的 UnhandledPromiseRejectionWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671258/
我有 await 语句,它们可能会引发错误,因此我在 try/catch 内执行它们。但是 try/catch 没有捕获它们,我收到警告: (node:4496) UnhandledPromiseRe
最近,我在ionic中创建了一个应用程序,我想在ios中对其进行测试。所以我运行命令ionic cordova emulate ios。但是,这给了我以下错误。 (节点:4200)UnhandledP
我正在尝试使用 node.js discord 模块制作一个机器人,当在 discord 中输入命令时,它会向用户发送私有(private)消息。该命令应该像这样使用 !rp 然后邮件将发送给收件人
我正在尝试调用一个异步方法。异步方法是: async connect() { this.pool = await mysql.createPool(this.conf);
我按议程包编写了一些代码,但在运行我的项目时遇到了 UnhandledPromiseRejectionWarning。 我的代码在这里: agenda.define('transferDBField'
我有一个代码: function () { return new Promise((resolve, reject) => { try { fetch(URL, { metho
以下是我在 graphql(apollo-server)服务器中的 onDisconnect 函数代码(但不是特定于 graphql 的)。它包含一个 postgres 事务,通过 DB 适配器使用。
我是 Javascript Promise 的新手。我正在尝试以基于 Promises 的方式执行 MySQL 查询,我已经挠头半个小时了,但我仍然找不到这段代码中的问题。我正在使用this arti
尝试从 localhost:3000/todos/在 mongodb 中创建数据后获取数据,我在 Node 中收到错误 [UnhandledPromiseRejectionWarning: 错误 [E
我收到以下错误: Houston we got an err at getGames in index.js (node:72197) UnhandledPromiseRejectionWarning
所以我正在使用 Express.JS 和 MongoDB 制作一个 Web 应用程序,当我尝试在本地运行它时,它可以工作,但是当我用我的 aws Ubuntu 20.04 机器运行它时,它给了我以下错
我在调用其他发出 axios 请求的函数的函数中处理 UnhandledPromiseRejectionWarning 时遇到问题。 const getCode = async () => { c
我对 Node JS 还很陌生,所以我有点挣扎。 我正在尝试使用 Google Drive 的 API 从我的 Node Js 代码读取文件。 我有以下代码 router.get('/', funct
我正在使用 Angular/Firebase 在 Ionic 中构建一个应用程序。 我想在我的 Android 设备上测试该应用程序,该设备以前运行良好。但是,最近我无法运行它,因为出现错误。 $ i
这个问题在这里已经有了答案: How is PromiseRejectionEvent triggered? (2 个答案) 关闭 3 年前。 如果我在拒绝 promise 后清除计时器 - 无论我
我的目标是使用 Node.js 从网站上抓取一些数据. 我已经设法仅使用request 包来抓取数据,但是我要抓取的站点具有动态内容,而request 只能抓取此动态数据。 所以我做了一些研究,发现要
我玩过 Mocha 测试。我注意到我的函数在少数地方引发了 “UnhandledPromiseRejectionWarning” 警告。它使脚本无法通过检查。 我无法在互联网上找到有用的示例来教授/展
最近,我在测试代码时经常遇到此错误。刚才我在尝试执行包含错误的同步代码时再次收到此错误: (async function() { const characterProfile = await Mo
我知道涉及 SO 上的 UnhandledPromiseRejectionWarning 问题的现有答案,但找到的答案似乎都与我的情况不充分匹配。基本上,我以为我知道如何处理 promise 。但这个
我当前的nodejs版本是:8.9.1 我正在尝试执行我的代码,但总是遇到此错误,尝试修复它,但总是出现相同的错误: (node:38) UnhandledPromiseRejectionWarnin
我是一名优秀的程序员,十分优秀!