javascript - 每个文件强制执行一个描述

标签 javascript jasmine protractor eslint static-code-analysis

故事:

我们有一个相当大的测试代码库,其中包含 Protractor+Jasmine 测试。

我们目前遇到的一个问题是,一些测试/规范文件包含多个描述,这不时会引起麻烦 - 例如,当一个接一个地调试测试时(或分批)我们使用fdescribe/fit;有时我们没有注意到底部的同一文件中还有其他 decribe,最终导致部分测试被无意中跳过。

换句话说,这是一种“每次测试一个断言”类型的规则的变体,有助于保持测试代码库干净和“平坦”。

问题:

有没有办法禁止每个文件有多个describe?我目前正在考虑通过静态代码分析和 ESLint 来解决这个问题,但我也对其他解决方案持开放态度。

示例:

违规示例:

describe("Test 1", function () {
    it("should do something", function () {
        expect(true).toBe(true);
    });
});

describe("Test 2", function () {
    it("should do something else", function () {
        expect(false).toBe(false);
    });
});

如果有单个 describe block ,但它包含嵌套的 describe,则不应将其报告为违规。换句话说,可以拥有:

describe("Test 1", function () {
    it("should do something", function () {
        expect(true).toBe(true);
    });

    describe("Test 2", function () {
        it("should do something else", function () {
             expect(false).toBe(false);
        });
    });
});

最佳答案

棘手的部分是仅标记未嵌套或“顶级”描述的描述 block 。幸运的是,使用 ESLint 完全可以做到这一点!

ESLint 在遍历 JavaScript 代码的抽象语法树(简称 AST)时两次“访问”节点:一次是向下树,另一次是返回起来。 树的遍历深度优先,所以如果例如你的代码中有 3 个 describe block ,如下所示:

describe("Test 1", function () {
    it("should do something", function () {
        expect(true).toBe(true);
    });

    describe("Test 2", function () {
        it("should do something else", function () {
             expect(false).toBe(false);
        });
    });
});

describe("Test 3", function () {
    it("should do something", function () {
        expect(true).toBe(true);
    });
});

将按以下顺序访问节点:

进入“测试1” -> 进入“测试2” -> 退出“测试2” -> 退出“测试1” -> 进入“测试3” -> 退出“测试3”

这意味着我们只需要在“向下”子树时跟踪堆栈中的所有 describe 调用,然后在向该子树“向上”时一次弹出一个调用。如果在上升过程中只剩下一个节点要从堆栈中弹出,则该节点是“顶级”describe

最后,如果我们发现超过“顶级”描述,那么我们的规则应该报告错误。我为您制作了一个小型工作原型(prototype):https://astexplorer.net/#/3vMUwQjfpD/2

关于javascript - 每个文件强制执行一个描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39436530/

相关文章:

node.js - 如何使用 Protractor 验证 HTML 属性是否包含绝对或相对 URL?

javascript - 应该防止 Jquery Date Picker 箭头键

javascript - jQuery Flyin 效果不居中

javascript - Protractor 点击元素并计算 child 数

javascript - 如何在 Protractor 中直接访问 'until' 对象?

javascript - div 中的第 n 个类型不起作用

javascript - react 不适用于错误的请求

javascript - jquery ui selectable如何停止选择内部元素?

javascript - Jasmine 检查方法中是否定义了变量

javascript - 通过 Jasmine 的 toHaveBeenCalledWith 方法使用对象类型