最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 笑话回顾:什么时候运行?

    笑话回顾:什么时候运行?

    tl;dr:执行顺序

    1. 顶层和describe() 块中的所有内容(其中describe() 块基本上是iife)
    2. 之前所有()

      1. 顶级
      2. 第一级描述()
      3. 第n级describe()
    3. 在每个()之前

      1. 顶级
      2. 第一级描述()
      3. 第n级describe()
    4. 测试()
    5. 每个之后()

      1. 第n级describe()
      2. 第一级描述()
      3. 顶级
    6. 毕竟()

      1. 第n级describe()
      2. 第一级描述()
      3. 顶级

    免责声明

    我假设您对笑话和单元测试有基本的了解。我不会解释钩子的含义。这更多的是备忘单/参考类型的帖子。

    有规则

    乍一看,笑话似乎有神奇的作用。什么时候执行什么?但如果你想一想,它就会变得明显不那么令人困惑。

    也许这些简单的“规则”有帮助:

    1. 每个文件都是独立执行的:您在 a.test.js 中所做的任何操作都不会影响 b.test.js。 (除非你开始访问外部资源)
    2. describe() 回调会立即执行。
    3. 钩子(beforeall/afterall、beforeeach/aftereach)从外部作用域(顶级/模块)到内部作用域(描述)执行。

    基本示例

    console.log("./<start>");
    
    beforeall(() => {
        console.log("./beforeall");
    })
    beforeeach(() => {
        console.log("./beforeeach");
    })
    afterall(() => {
        console.log("./afterall");
    })
    aftereach(() => {
        console.log("./aftereach");
    })
    
    describe("foo", () => {
        console.log("./describe(foo)/<start>");
    
        beforeall(() => {
            console.log("./describe(foo)/beforeall");
        })
        beforeeach(() => {
            console.log("./describe(foo)/beforeeach");
        })
        afterall(() => {
            console.log("./describe(foo)/afterall");
        })
        aftereach(() => {
            console.log("./describe(foo)/aftereach");
        })
    
        test("testfoo", () => {
            console.log("./describe(foo)/test(testfoo)");
        })
    
        console.log("./describe(foo)/<end>");
    })
    
    describe("bar", () => {
        console.log("./describe(bar)/<start>");
    
        beforeall(() => {
            console.log("./describe(bar)/beforeall");
        })
        beforeeach(() => {
            console.log("./describe(bar)/beforeeach");
        })
        afterall(() => {
            console.log("./describe(bar)/afterall");
        })
        aftereach(() => {
            console.log("./describe(bar)/aftereach");
        })
    
        test("testbar", () => {
            console.log("./describe(bar)/test(testbar)");
        })
        test("testotherbar", () => {
            console.log("./describe(bar)/test(testotherbar)");
        })
    
        console.log("./describe(bar)/<end>");
    })
    
    console.log("./<end>");
    </end></end></start></end></start></start>

    这是结果(在我删除其他输出后):

    ./<start>
    ./describe(foo)/<start>
    ./describe(foo)/<end>
    ./describe(bar)/<start>
    ./describe(bar)/<end>
    ./<end>
    
    ./beforeall
    
    ./describe(foo)/beforeall
    ./beforeeach
    ./describe(foo)/beforeeach
    ./describe(foo)/test(testfoo)
    ./describe(foo)/aftereach
    ./aftereach
    ./describe(foo)/afterall
    
    ./describe(bar)/beforeall
    ./beforeeach
    ./describe(bar)/beforeeach
    ./describe(bar)/test(testbar)
    ./describe(bar)/aftereach
    ./aftereach
    
    ./beforeeach
    ./describe(bar)/beforeeach
    ./describe(bar)/test(testotherbar)
    ./describe(bar)/aftereach
    ./aftereach
    ./describe(bar)/afterall
    
    ./afterall
    </end></end></start></end></start></start>

    会发生什么?

    顶层和描述回调中的所有内容都会立即执行:

    ./<start>
    ./describe(foo)/<start>
    ./describe(foo)/<end>
    ./describe(bar)/<start>
    ./describe(bar)/<end>
    ./<end>
    [...]
    </end></end></start></end></start></start>

    顶层的 beforeall 和 afterall 是所有测试的“支撑”。每个只执行一次。

    [...]
    
    ./beforeall
    
    [...]
    
    ./afterall
    

    ./describe(*)/beforeall 和 ./describe(*)/afterall 是 that 描述回调中所有测试的大括号。每个只执行一次。

    [...]
    
    ./describe(foo)/beforeall
    [...]
    ./describe(foo)/afterall
    
    ./describe(bar)/beforeall
    [...]
    ./describe(bar)/afterall
    
    [...]
    

    beforeeach 和 aftereach 是每个测试周围的大括号。最顶层是大括号。描述级别是内部大括号。

    [...]
    ./beforeeach
    ./describe(*)/beforeeach
    [...]
    ./describe(*)/aftereach
    ./aftereach
    [...]
    

    高级版

    这是一个带有嵌套描述块的高级示例。它生成 xmlish 结果来强调执行步骤的分层性质。

    console.log("<top-level>");
    
    beforeall(() => {
        console.log("<all>");
    })
    beforeeach(() => {
        console.log("<each>");
    })
    afterall(() => {
        console.log("</each></all>");
    })
    aftereach(() => {
        console.log("");
    })
    
    describe("foo", () => {
        console.log("<describe id='"foo"'>");
    
        beforeall(() => {
            console.log("<all in='"foo"'>");
        })
        beforeeach(() => {
            console.log("<each in='"foo"'>");
        })
        afterall(() => {
            console.log("</each></all><!-- in="foo" -->");
        })
        aftereach(() => {
            console.log("  <!-- in="foo" -->");
        })
    
        test("testfoo", () => {
            console.log("<test in='"foo"' id='"testfoo"'></test>");
        })
    
        console.log("</describe><!-- id="foo" -->");
    })
    
    describe("bar", () => {
        describe("barinner", () => {
            console.log("<describe id='"barinner"'>");
    
            beforeall(() => {
                console.log("<all in='"barinner"'>");
            })
            beforeeach(() => {
                console.log("<each in='"barinner"'>");
            })
            afterall(() => {
                console.log("</each></all><!-- in="barinner" -->");
            })
            aftereach(() => {
                console.log(" <!-- in="barinner" -->");
            })
    
            test("testbarinner", () => {
                console.log("<test in='"barinner"' id='"testbarinner"'></test>");
            })
    
            console.log("</describe><!-- id="barinner" -->");
        })
    
        console.log("<describe id='"bar"'>");
    
        beforeall(() => {
            console.log("<all in='"bar"'>");
        })
        beforeeach(() => {
            console.log("<each in='"bar"'>");
        })
        afterall(() => {
            console.log("</each></all><!-- in="bar" -->");
        })
        aftereach(() => {
            console.log(" <!-- in="bar" -->");
        })
    
        test("testbar", () => {
            console.log("<test in='"bar"' id='"testbar"'></test>");
        })
        test("testotherbar", () => {
            console.log("<test in='"bar"' id='"testotherbar"'></test>");
        })
    
        console.log("</describe><!-- id="bar" -->");
    })
    
    console.log("</top-level>");
    

    这是经过一些清理和格式化后的输出:

    <top-level><describe id="foo"></describe><!-- id="foo" --><describe id="barinner"></describe><!-- id="barinner" --><describe id="bar"></describe><!-- id="bar" --></top-level><all><all in="foo"><each><each in="foo"><test in="foo" id="testFoo"></test></each><!-- in="foo" --></each></all><!-- in="foo" --><all in="bar"><all in="barinner"><each><each in="bar"><each in="barinner"><test in="barinner" id="testBarInner"></test></each><!-- in="barinner" --></each><!-- in="bar" --></each></all><!-- in="barinner" --><each><each in="bar"><test in="bar" id="testBar"></test></each><!-- in="bar" --></each><each><each in="bar"><test in="bar" id="otherBar"></test></each><!-- in="bar" --></each></all><!-- in="bar" --></all>

    这就是关于执行顺序的全部知识。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 笑话回顾:什么时候运行?
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 294稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情