如何在手表模式下进行任何摩卡测试之前运行全局设置脚本
Posted
技术标签:
【中文标题】如何在手表模式下进行任何摩卡测试之前运行全局设置脚本【英文标题】:How can I run a global setup script before any mocha test in watch mode 【发布时间】:2019-11-05 00:18:41 【问题描述】:我想以 TDD 方式(--watch 模式)运行 mocha 测试,效果很好。 但我有一个“全局 setup.js”文件,它模拟了大多数测试使用的应用程序的一部分。
如果我第一次正常运行测试或在监视模式下运行测试,一切都很好,因为安装脚本已加载。
但是,如果测试或源文件发生更改,则只有相关的测试会运行(理论上听起来很棒),但由于我的全局模拟脚本没有运行,因此测试会失败。
即使在 mocha 的监视模式下,我如何每次都执行设置脚本(每次整体测试运行一次)?
这是我使用的命令:
vue-cli-service test:unit --watch
# pure mocha would be (I assume)
mocha 'tests/**/*.spec.js' --watch
我已尝试使用 --require 和 --file 选项,但它们也不会在文件更改时重新运行。
我正在使用通过 VUE CLI 创建的 vue 应用程序,这就是我的代码的外观
// setup.spec.js
import config from "@vue/test-utils";
before(() =>
config.mocks["$t"] = () => ;
);
// some_test.spec.js
import expect from "chai";
import shallowMount from "@vue/test-utils";
import MyComp from "@/components/MyComp.vue";
describe("MyComp", () =>
it("renders sth", () =>
const wrapper = shallowMount(MyComp);
expect(wrapper.find(".sth").exists()).to.be.true;
);
);
【问题讨论】:
【参考方案1】:这不是一个非常令人满意的答案,因为感觉应该有更好的方法,但您可以将设置脚本导入到单独的测试文件中。
例如:
// some_test.spec.js
import 'setup.spec.js' //<-- this guy right here
import expect from "chai";
import shallowMount from "@vue/test-utils";
import MyComp from "@/components/MyComp.vue";
describe("MyComp", () =>
it("renders sth", () =>
const wrapper = shallowMount(MyComp);
expect(wrapper.find(".sth").exists()).to.be.true;
);
);
感觉不太理想,但比到处复制逻辑要好。
【讨论】:
我目前的解决方案是导入 setup 函数并在它需要的每个测试的 before 语句中使用它。这样至少我没有带有副作用的魔法进口。 @SergejHerbert,是的,我明白你的推理了。我可能会改为这样做。感觉mocha应该有更好的办法。我在github.com/mochajs/mocha/issues/1460 提出了一个问题,他们要么让我知道我遗漏了一些东西,要么我将打开功能请求。 看来您应该能够使用 mocha 的--require
选项来确保在测试用完之前始终加载文件。您可以在 cli 或 mocha.opts
中执行此操作。我还不能让它工作,我认为 Typescript 和 Vue CLI 的组合对我来说是太多抽象层次了。
我尝试使用 --require (如问题中所述),但我得到相同的行为,仅在第一次运行时执行...【参考方案2】:
您是否尝试过在运行测试之前使用 .mocharc.js 文件来设置您的 mocha 配置?
'use strict';
module.exports =
package: './package.json',
watch: true,
timeout: 100000
;
【讨论】:
这个配置文件应该如何在所有测试之前运行设置脚本?以上是关于如何在手表模式下进行任何摩卡测试之前运行全局设置脚本的主要内容,如果未能解决你的问题,请参考以下文章