Mocha 如何知道在测试套件中首先加载哪个文件

2024-04-10

我正在尝试学习 MongodB 的测试驱动方法。文件夹结构

A user.js在src文件夹中测试

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
const Schema = mongoose.Schema;

const UserSchema = new Schema ({
    name: String
});

const User = mongoose.model('user', UserSchema);

module.exports = User;

内容test_helper.js

const mongoose = require('mongoose');;

mongoose.connect('mongodb://localhost/users_test');

    mongoose.connection
    .once('open', () => {
        console.log('Connected to Mongo!');
        done()}) 
    .on('error', (error) => { 
        console.warn('Warning', error);
    });

create_test.js content

const assert = require('assert');
const User = require('../src/user');

describe('Creating records', () => {

    it('Saves a user', (done) => {
        const user = new User({ name: 'Ankur' });
        user.save()
                .then(() => {
                    assert(!user.isNew);
                    done();
                });

现在当我跑步时npm test测试正在通过。

Connected to Mongo!
  Creating records
    √ Saves a user (779ms)

但我的疑问是如何Mocha知道运行test_helper.js每次都先归档。 (将此文件命名为任何其他名称也不会改变行为)。

另外,我没有使用任何根级挂钩。

我知道 mocha 从根目录开始在每个目录中递归加载文件,因为这里的所有内容都只是一个目录,所以它在这里没有任何区别。

有人可以建议或帮忙吗,Mocha 到底是怎么知道的test_helper.js(或具有相同内容的任何文件名)应首先运行。


Mocha 如何加载测试文件没有默认的设置顺序。

当摩卡扫描目录 https://github.com/mochajs/mocha/blob/f6605cf012bef4353ef8824bccd10c36d828e06b/lib/utils.js#L683为了找到它的文件,它使用fs.readdirSync https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options。这个调用是一个包装器readdir(3) http://man7.org/linux/man-pages/man3/readdir.3.html,它本身并不能保证顺序。现在,由于一个实施怪癖 https://github.com/nodejs/node/issues/3232的输出fs.readdir and fs.readdirSync在 Linux 上排序(通常也可能是 POSIX 系统),但是不在 Windows 上。此外,Linux 上的排序行为最终可能会被删除,因为文档说fs.readdir只是readdir(3)并且后者不保证顺序。有一个很好的论据表明,在 Linux 上观察到的行为是一个错误(请参阅我上面链接的问题)。

请注意,有一个--sortMocha 找到文件后对文件进行排序的选项。但默认情况下此功能处于关闭状态。

您观察到的行为不仅可以通过加载顺序来解释,还可以通过执行顺序来解释。发生的情况如下:

  1. Mocha 加载测试文件并执行它们。因此,文件顶层的所有内容都会执行马上。这意味着代码中test_helper.js立即执行。每次致电describe立即执行其回调。但是,致电it记录测试以供以后执行。摩卡是发现您在执行此操作时进行的测试但没有执行马上他们。

  2. 执行所有文件后,Mocha 开始运行测试。此时,代码中test_helper.js已经运行,您的测试将从它创建的连接中受益。

重大警告连接数据库是一个异步操作,目前没有任何东西可以保证异步操作test_helper.js将在测试开始之前完成。现在能正常工作只是运气。

如果是我,我要么将连接创建放在全局异步中before钩。 (Aglobal before出现在任何测试文件中的钩子将在任何测试之前执行,甚至出现在其他文件中的测试。)或者我会use --delay https://stackoverflow.com/a/38268832/1906307并显式调用run()确保建立连接后启动套件。

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

Mocha 如何知道在测试套件中首先加载哪个文件 的相关文章

  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 将音频与视频流合并 Node.js

    我正在创建 YouTube 视频下载器并且正在使用ytdl core库 它无法下载带有音频的高质量视频 因为 youtube 将其放在另一个文件中 但我需要将其全部下载到一个文件中 我已经这样做了 app get download asyn
  • 如何在 d3 js 中突出显示从根到选定节点的路径?

    我使用 d3 js 创建了一棵树 现在我创建了一个下拉菜单 其中包含树中所有节点的列表 现在 从下拉菜单中选择一个节点时 我想突出显示从根到该特定节点的路径 这个怎么做 首先创建一个 flatten 函数 它将分层数据变成一个 n 数组 f
  • 创建 Cookie 时需要帮助

    我有一个名为yes和另一个名叫no
  • Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

    我主要了解 Ember JS 的基础知识 大多数示例实际上只处理单个控制器和模型以在页面上显示某些内容 我真的很想用 Ember 构建一个完整的 Web 应用程序 所以有人能告诉我如何组织和连接多个控制器 模型和视图到一个页面中吗 例如 如
  • 保存/导出Chrome的JavaScript控制台输入历史记录

    无论如何 我可以保存或导出 JavaScript 控制台的历史记录吗 input 控制台历史记录 在 Google Chrome 中 我不想保存输出或错误 因此将鼠标悬停在控制台框上 右键单击并选择Save as 不是解决方案 我不想每次都
  • 如何滚动到div内的元素?

    我有一个滚动的div我想在点击它时发生一个事件 它会强制执行此操作div滚动以查看内部元素 我写的JavasCript是这样的 document getElementById chr scrollIntoView true 但这会在滚动时滚
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • 选中复选框时提交表单

    有没有办法在选中复选框时提交表单
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en
  • 加载另一个 JS 脚本后加载

    这是我的代码 very big js file lots of html stuff 问题是 这些是异步加载的 有没有办法等待第二个脚本直到第一个脚本加载 如果您使用 jQuery 有一个非常简单的方法可以通过获取脚本 https api
  • ES6 模板文字的延迟执行

    我正在玩新的ES6 模板文字 http tc39wiki calculist org es6 template strings 我首先想到的是String format对于 JavaScript 所以我开始实现一个原型 String pro
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • 用于标签搜索的数据存储解决方案

    我已经按照预先计算的分数订购了数百万件商品 每个项目都有许多布尔属性 假设总共有大约一万个可能的属性 每个项目有十几个 我希望能够请求实时 几毫秒 给定任意属性组合的前 n 个项目 您会推荐什么解决方案 我正在寻找可扩展性极强的东西 我们目
  • 如何修复超出最大调用堆栈大小

    有一个 MERN Firebase 应用程序并收到此错误和一堆 atdeepExtend deepCopy ts 71 RangeError Maximum call stack size exceeded getApps as apps
  • 如何在 SVG 元素上使用箭头标记?

    我需要在 d3 js 中创建一个箭头 但我找到的只是带有节点图的示例 我需要的是简单地制作一个从 A 点到 B 点的箭头 我尝试实现以下示例中的部分代码 http bl ocks org 1153292 http bl ocks org 1
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o

随机推荐