承诺和摩卡:是否在之前完成()?

2023-11-25

我在读关于摩卡承诺测试的一些教程。有一段代码:

before(function(done) {
  return Promise.resolve(save(article)).then(function() {
    done();
  });
});

Why done()调用在then() in the before()?上面的代码和下面的代码有什么区别:

before(function(done) {
  return Promise.resolve(save(article));
});

Thanks

UPDATE

我的问题是与以下代码进行比较:

before(function() {
  return Promise.resolve(save(article));
});

抱歉,打错字了。


第一个代码片段带有before钩子返回一个承诺and calls done。在 Mocha 3.x 及以上版本中,会导致以下错误:

Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.

过去,如果您使用过,这并不特别重要done并返回了一个承诺,但最终 Mocha 开发人员认为指定两者done and返回承诺只意味着测试设计者犯了一个错误,最好让 Mocha 配合,而不是默默地允许它。

在你的第二个片段中,你有done争论并返回一个承诺,但 Mocha 仍会等待done被调用并且会超时。 (它确实应该检测参数并像第一种情况一样引发错误,但它没有......)

通常,如果您正在测试产生 Promise 的异步操作,则返回 Promise 比使用 Promise 更简单done.这是说明问题的示例:

const assert = require("assert");

// This will result in a test timeout rather than give a nice error
// message.
it("something not tested properly", (done) => {
    Promise.resolve(1).then((x) => {
        assert.equal(x, 2);
        done();
    });
});

// Same test as before, but fixed to give you a good error message
// about expecting a value of 2. But look at the code you have to
// write to get Mocha to give you a nice error message.
it("something tested properly", (done) => {
    Promise.resolve(1).then((x) => {
        assert.equal(x, 2);
        done();
    }).catch(done);
});

// If you just return the promise, you can avoid having to pepper your
// code with catch closes and calls to done.
it("something tested properly but much simpler", () => {
    return Promise.resolve(1).then((x) => {
        assert.equal(x, 2);
    });
});

关于异步操作的完成,无论你使用的是it, before, beforeEach, after or afterEach所以即使我给出的例子是it,这同样适用于所有钩子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

承诺和摩卡:是否在之前完成()? 的相关文章

  • 为什么 AngularJS 在使用 ng-bind-html 时会去掉 data- 属性?

    我正在使用 contentEditable div 来使用户能够格式化他们的文章 我对html内容做了一些处理并保留它 我在用ng bind html当观众想要阅读文章时呈现结果 我不想使用 sce trustAsHtml因为我仍然希望 A
  • 禁用 Ctrl + 滚动以缩放谷歌地图

    Does anybody know how to disable the CTRL Scroll First when the mouse wheel was moved the Map would Zoom in out But now
  • 减少 JavaScript 中的对象数组

    我在 javascript 中有一个想要减少的对象数组 请参阅下面的代码 6 位或以上的消息已验证 较少的消息未验证 我将他们按组分组 const myArray group groupA message Text without a nu
  • Android 上的 setTimeOut() 相当于什么?

    我需要等效的代码setTimeOut call function milliseconds 对于安卓 setTimeOut call function milliseconds 您可能想查看定时任务 http developer andro
  • 如何在 guildMemberAdd 中使用awaitReactions

    当用户连接到我的服务器时 我向他们发送消息 并且我想通过单击反应来继续授权 我怎样才能创建这个 我正在使用以下代码 robot on guildMemberAdd gMembAdd gt gMembAdd send Hi gMembAdd
  • 找不到 firebase-messaging.js laravel

    大家好 我正在使用 firebase 制作一个用于推送通知的应用程序 这是我在 firebase 中的第一个项目 我遇到的问题是当我运行项目并单击它给我的登录按钮时的连接 已授予通知权限 但在此之后它返回一个错误 如下所示 获取脚本时收到错
  • .getDay() 奇怪的行为[重复]

    这个问题在这里已经有答案了 有一个例子 console log new Date 2013 02 24 getDay 24 gt 0 24 console log new Date 2013 02 25 getDay 25 gt 1 25
  • 无法使用 Node.JS 将 null 值发送到 MySQL 数据库

    我正在尝试发送null使用 Node JS 到我的 MySQL 数据库 con query INSERT INTO Routes routeTrigger VALUES null title test function err result
  • 如何获取 CSS 旋转元素的实际(非原始)高度

    我需要获取几个不同元素的实际高度 为了精确的自定义工具提示定位 并且其中一些元素 不是全部 被旋转 elem outerHeight 返回原始高度 而不是实际显示的高度 这是一个非常简单的例子 http jsfiddle net NPC42
  • 错误:导航器只能包含“屏幕”组件作为其直接子组件

    我是 React Native 新手 收到此错误 但无法解决它 我正在遵循主要的教程反应导航页面 https reactnavigation org docs screen options resolution 但我无法完成它 我将不胜感激
  • 与玻璃钢战斗

    我读过有关 FRP 的内容 非常兴奋 它看起来很棒 因此您可以编写更多高级代码 并且一切都更加可组合 等等 然后我尝试用数百个 sloc 从纯 js 到 Bacon 重写我自己的小游戏 我发现 我实际上不是编写高级纯逻辑代码 而是击败了 B
  • Node.JS Web 服务器中的安全性

    所以 我正在学习 Node JS 到目前为止我很喜欢它 我已经有几个项目在工作了 我想我可以在其中使用nodejs 不过 我担心安全问题 如果我使用 Node JS http 模块编写自定义 Web 服务器 我是否可能非常容易受到攻击 Ap
  • 如何切换整个页面的深色主题?

    我已经成功地在 html 和 Flask 中按下复选框时切换深色主题和浅色主题 但是我怎样才能让深色主题覆盖整个页面 而不仅仅是一些 div 元素呢 边距仍然是浅色主题 CSS代码如下 container display flow widt
  • 如何使 Loopback 模型事件起作用?

    我尝试过一个例子http apidocs strongloop com loopback model http apidocs strongloop com loopback model MyModel on changed functio
  • JavaScript 中的自定义“确认”对话框?

    我一直在开发一个使用自定义 模式对话框 的 ASP net 项目 我在这里使用吓人引号 因为我知道 模式对话框 只是我的 html 文档中的一个 div 它被设置为出现在文档其余部分的 顶部 而不是真正意义上的模式对话框 在网站的许多部分
  • 需要了解Javascript函数提升示例

    我阅读了 Javascript 提升的概念 它非常令人困惑 但我看到了一些示例并了解了提升的实际作用 所以基本上 提升是 JavaScript 的默认行为 即将所有声明移动到当前作用域的顶部 当前脚本或当前函数的顶部 但我无法理解以下实现
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • Rails 6 webpack 抛出“未捕获的引用错误:$未定义”

    大家好 我最近开始使用 ruby 2 6 5 开发 Rails 6 由于 Rails 6 引入了 webpack 所以我尝试使用 webpack 加载我的 js 文件 尽管我已经在 appliation js 中需要了 jquery 但我仍
  • JavaScript 不是 DOM 的一部分吗?

    为什么即使从 DOM 中删除用于创建脚本的代码 脚本仍然可以运行 我遇到了一种情况 我想阻止损坏的脚本运行 查看我的帖子 https stackoverflow com questions 2685581 is there a way to
  • 获取不正确的日期,将时间戳转换为新日期

    我正在尝试将时间戳转换为日期 但得到的日期不正确 我正在开发一个使用 Angular 和 Typescript 的项目 我有这样的时间戳 1451642400 2016年1月1日 和1454320800 2016年2月1日 如果我编码 da

随机推荐

  • Jboss 在根上下文中部署

    是的 我知道enable welcome root false 但在文件中找不到这个 使用 Wildfly Final 或 jboss eap 6 2 在哪儿 为什么我需要在 WEB INF 中添加 jboss web xml 有问题的文件
  • “@Transactional”应该放在服务层或 DAO 的哪里

    首先 我可能正在问一些以前被问过并回答过的问题 但我无法返回搜索结果 我们在服务层定义事务注释 典型的 Spring Hibernate CRUD 通常是 控制器 gt 管理器 gt Dao gt Orm 我现在遇到的情况是 我需要根据客户
  • 在谷歌地图android上实现落针动画

    我正在我的 Android 应用程序中实现谷歌地图 在此过程中我想添加落针动画 我已经搜索了所有内容 但找不到执行此操作的确切方法 任何人都可以帮助我如何做 这将是一个很大的帮助 将标记添加到地图中的所需位置 然后使用该标记调用此函数 pr
  • Python - PyQt - QTable Widget - 添加行

    我是 PyQt 的新手 无论如何仍然有点困惑 我有一个像这样的文本文件结构 姓名 姓氏 电话 电子邮件 空格实际上是制表符 t 现在当我用我的方法读取这个文件时 我希望填充 QTableWidget 我的 QTable Widget 有 4
  • C Int 和 Long 32 - 64 位中的值范围

    我对 C 中 Int 变量的值范围感到困惑 我知道 32 位 unsigned int 的范围是 0 到 65 535 那么只要有0到4 294 967 295 这在 32 位机器上没问题 但现在在 64 位机器中一切都保持不变吗 或者也许
  • 连接两个 gatsby 节点

    所以 我正在使用盖茨比 mdx用于从 MDX 文件创建站点的插件 我想在 SitePage 对象和 Mdx 对象之间创建关联 以便我可以对 SitePage 边缘执行一个 graphQL 查询来构建站点导航 我的大部分代码都是用 TypeS
  • 如何链接没有字幕的 YouTube 视频?

    可以链接吗youtubeHTML 代码中的视频不显示其字幕 字幕 假设我有以下视频 http www youtube com watch v kTvHIDKLFqc 它有默认的英文字幕 但是 当链接该视频时 我想在没有它们的情况下加载它 是
  • C++ 中正态分布的随机数

    作为 C 的完全初学者 我想从正态分布生成一个随机数 使用以下代码 源自此post 我能够这样做 include
  • 我可以在 Windows 7 上使用 C# .NET 开发 Blackberry 应用程序吗

    嘿 我非常有兴趣为黑莓操作系统构建一个应用程序 我可以用 C 来做吗 Blackberry 还推出了 Visual Studio 插件 但您将如何将其与模拟器一起使用 不 你做不到 你必须使用Java来做黑莓开发 黑莓曾经有一个 C C A
  • 使用 ggplot2 以粗体显示各个轴标签

    改编自这个问题和解决方案的问题 使用 ggplot2 以粗体突出显示各个轴标签 我想根据满足标准有选择地证明水平轴标签的合理性 因此 借用上述问题和答案 我设置了一个示例 require ggplot2 require dplyr set
  • 如何在 CSS 中用 div 制作尖箭头

    如何在 CSS 中制作尖箭头 不只是一个三角形 而是一个有茎的三角形 就像用弓射出的传统箭一样 我试图通过创建一个 div 容器来做到这一点 其中包含两个容器 左容器和右容器 右侧将包含三角形 左侧将包含三个 div 其中心将被着色以创建主
  • AdMob 在 Android 中需要哪些权限

    On 谷歌的网站他们只提到其中两个
  • 记录 Excel 自动完成的 VBA 代码

    使用VBA编写要在Excel中使用的自定义函数时 如何编写文档注释以便在自动填充公式期间自动显示Excel 例如 当我们开始输入 VLookUp 时 它会显示 Vlookup 作为工具提示的作用 显示输入变量名称 如果我们按功能区中的 插入
  • 静态变量被初始化两次

    考虑我在编译单元中有一个静态变量 它最终出现在static库 libA 然后我有另一个编译单元访问这个变量 最终出现在shared库 libB so 因此 libA 必须链接到 libB 最后我有一个 main 函数也直接从 A 访问静态变
  • iOS 7 - 调整状态栏

    我无法确定如何调整 iOS7 中的状态栏 我的视图控制器有一个tableView 我想要tableView在状态栏下启动 目前 它与状态栏重叠 顶部的标签是headerView in the tableView 我已通过 IB 在视图控制器
  • 矩阵列表中每个元素的平均值

    我有一个包含三个矩阵的列表 a lt matrix runif 100 b lt matrix runif 100 c lt matrix runif 100 mylist lt list a b c 我想获得三个矩阵中每个元素的平均值 我
  • Python3添加日志级别

    我有这段代码 对我来说效果很好 import logging import logging handlers logger None def create logger global logger logger logging getLog
  • jQuery 点击事件在移动浏览器中不起作用

    jQuery 单击事件似乎没有在移动浏览器中触发 HTML如下 ul class menu li a href home HOME a li li class publications PUBLICATIONS amp PROJECTS l
  • C# 的远程 SQL 服务器的正确连接字符串

    我只想知道远程 sql server Express 版本的正确 sql 连接字符串 这就是我得到的 但我遇到了一些问题 SqlConnection cs new SqlConnection Data Source IP Address P
  • 承诺和摩卡:是否在之前完成()?

    我在读关于摩卡承诺测试的一些教程 有一段代码 before function done return Promise resolve save article then function done Why done 调用在then in t