【问题标题】:Enforce one describe per file对每个文件执行一个描述
【发布时间】:2016-09-11 13:19:19
【问题描述】:

故事:

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

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

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

问题:

有没有办法禁止每个文件有多个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 块,但它包含嵌套的 describes,则不应将其报告为违规。换句话说,这是可以的:

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);
        });
    });
});

【问题讨论】:

  • 嵌套描述块怎么样?
  • @jonrsharpe 好问题。只应考虑顶级描述。用一些示例更新了问题。谢谢!
  • 静态分析是要走的路。您应该将规则贡献给 github.com/lo1tuma/eslint-plugin-mocha 。这样任何有兴趣的人也可以使用它。

标签: javascript jasmine protractor eslint static-code-analysis


【解决方案1】:

棘手的部分是只标记非嵌套的描述块,或“顶级”描述。幸运的是,这完全可以通过 ESLint 实现!

ESLint 在遍历 JavaScript 代码的抽象语法树(简称 AST)时“访问”节点两次:一次是在 向下 树时,另一次是在返回时 向上。 该树首先遍历深度,因此,例如,如果您的代码中有 3 个 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);
        });
    });
});

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

将按以下顺序访问节点:

enter "Test 1" -> enter "Test 2" -> exit "Test 2" -> exit "Test 1" -> enter "Test 3" -> exit "Test 3"

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

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

【讨论】:

  • 这几乎是一个完整的规则,我将根据它制定一个自定义规则并在单独的答案中发布。不确定,如果这条规则应该是 eslint-plugin-mochaeslint-plugin-jasmine 的一部分(不幸的是,这条规则目前维护得不好),因为对这种狭窄的用例可能没有太多需求。非常感谢!
  • 规则现在是eslint-plugin-mocha的一部分!
【解决方案2】:

在@vitorbal 的规则示例代码的帮助下,pull request 和新的max-top-level-suites rule 现在被合并到eslint-plugin-mocha ESLint 插件中并成为其一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2021-08-08
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多