likes
comments
collection
share

如何使用 Mocha 和 Assert 测试 Node.js 模块(上)

作者站长头像
站长
· 阅读数 16

介绍

测试是软件开发的一个组成部分。程序员在进行更改时运行代码来测试他们的应用程序以确认其行为是否符合他们的意愿是很常见的。通过正确的测试设置,这个过程甚至可以自动化,从而节省大量时间。在编写新代码后始终如一地运行测试可确保新更改不会破坏预先存在的功能。这让开发人员对他们的代码库充满信心,特别是当它被部署到生产环境中以便用户可以与之交互时。

Mocha是一个比较流行的 JavaScript 测试框架。

在本文中,您将为Node.js TODO 列表模块编写测试。将带您使用 Mocha 测试框架来构建您的测试。然后使用 Node.jsassert模块自己创建测试。

先决条件

  • Node.js(本教程使用 Node.js 版本 10.16.0。)

第 1 步 — 编写节点模块

首先,我们需要设置编码环境。在终端中使用您的项目名称创建一个文件夹。本教程将使用名称todos

mkdir todos

然后进入那个文件夹:

cd todos

现在初始化npm,因为我们稍后将使用它的 CLI 功能来运行测试:

npm init -y

我们只有一个依赖项 Mocha,我们将使用它来组织和运行我们的测试。要下载并安装 Mocha,请使用以下命令:

npm i request --save-dev mocha

我们将 Mocha 作为dev依赖项安装,因为在生产环境中的模块不需要它。

最后,让我们创建包含模块代码的文件:

touch index.js

有了这个,我们就可以创建我们的模块了。index.js在文本编辑器中打开,例如nano

nano index.js

让我们从定义Todos 类开始。此类包含我们管理 TODO 列表所需的所有功能。将以下代码行添加到index.js

todos/index.js

class Todos {
    constructor() {
        this.todos = [];
    }
}

module.exports = Todos;

我们通过创建一个Todos类来作为入口。它的constructor()函数没有参数,因此我们不需要提供任何值来为这个类实例化一个对象。当我们初始化一个Todos对象时,我们所做的就是创建一个todos空数组的属性。

modules行允许其他 Node.js 模块需要我们的Todos类。 让我们添加一个函数来返回todos我们存储的数组。

//  todos/index.js
class Todos {
    constructor() {
        this.todos = [];
    }
    
    list() {
        return [...this.todos];
    }
}

module.exports = Todos;

我们的list()函数返回该类使用的数组的副本。它使用 JavaScript 的解构语法制作数组的副本。

注意:  JavaScript 数组是引用类型。这意味着对于数组的任何变量赋值或以数组作为参数的函数调用,JavaScript 引用创建的原始数组。例如,如果我们有一个包含三个项目的数组,x并创建一个新变量y,并且两者都引用同一事物。我们对具有影响变量的数组所做的任何更改,反之亦然。y = x``y``x``y``x

现在让我们编写add()函数,添加一个新的 TODO 项:

todos/index.js

class Todos {
    constructor() {
        this.todos = [];
    }
    
    list() {
        return [...this.todos];
    }
    
    add(title) {
        let todo = {
            title: title,
            completed: false,
        }
        
        this.todos.push(todo);
    }
}

module.exports = Todos;

我们的add()函数接受一个字符串,并将它放在一个新的 JavaScript对象的title属性中。新对象还有一个completed属性,false默认设置为。然后我们将这个新对象添加到我们的 TODO 数组中。

TODO 管理器中的重要功能是将项目标记为已完成。对于这个实现,我们将遍历我们的todos数组以找到用户正在搜索的 TODO 项。如果找到,我们会将其标记为已完成。如果没有找到,我们将抛出一个错误。

像这样添加complete()函数:

todos/index.js

class Todos {
    constructor() {
        this.todos = [];
    }
    
    list() {
        return [...this.todos];
    }
    
    add(title) {
        let todo = {
            title: title,
            completed: false,
        }
        
        this.todos.push(todo);
    }
    
    complete(title) {
        let todoFound = false;
        this.todos.forEach((todo) => {
            if (todo.title === title) {
                todo.completed = true;
                todoFound = true;
                return;
            }
        });

        if (!todoFound) {
            throw new Error(`No TODO was found with the title: "${title}"`);
        }
    }
}

module.exports = Todos;

保存文件并退出文本编辑器。

我们现在有了一个可以试验的基本 TODO 管理器。接下来,让我们手动测试我们的代码,看看应用程序是否正常工作。

第 2 步 — 手动测试代码

在这一步中,我们将运行代码的函数并观察输出以确保它符合我们的期望。这称为手动测试。这可能是程序员最常用的测试方法。尽管稍后我们将使用 Mocha 自动化我们的测试,但我们将首先手动测试我们的代码,以便更好地了解手动测试与测试框架的不同之处。

让我们将两个 TODO 项添加到我们的应用程序中,并将其中一项标记为完成。在文件所在的文件夹中启动index.js

node

您将>在 REPL 中看到提示,告诉我们可以输入 JavaScript 代码。在提示符处键入以下内容:

const Todos = require('./index');

使用require(),我们将 TODOs 模块加载到一个Todos变量中。回想一下,我们的模块Todos默认返回类。

现在,让我们为该类实例化一个对象。在 REPL 中,添加这行代码:

const todos = new Todos();

我们可以使用该todos对象来验证我们的实现是否有效。让我们添加我们的第一个 TODO 项:

todos.add("run code");

到目前为止,我们还没有在终端中看到任何输出。让我们通过获取所有 TODO 的列表来验证我们是否存储了我们的"run code"TODO 项:

todos.list();

你会在你的 REPL 中看到这个输出:

Output
[ { title: 'run code', completed: false } ]

这是预期的结果:我们的 TODO 数组中有一个 TODO 项,默认情况下它没有完成。

让我们添加另一个 TODO 项:

todos.add("test everything");

将第一个 TODO 项目标记为已完成:

todos.complete("run code");

我们的todos对象现在将管理两个项目:"run code""test everything"。TODO 也将"run code"完成。list()让我们再次调用来确认这一点:

todos.list();

REPL 将输出:

Output
[
  { title: 'run code', completed: true },
  { title: 'test everything', completed: false }
]

现在,使用以下命令退出 REPL:

.exit

目前可以看出我们所创建的测试模块的行为符合我们的预期。虽然我们没有将代码放入测试文件或使用测试库,但我们确实手动测试了我们的代码。但是,每次我们进行更改时,这种形式的测试都会变得很耗时。接下来,让我们在 Node.js 中使用 Mocha 测试框架解决这个问题。