我假设您对笑话和单元测试有基本的了解。我不会解释钩子的含义。这更多的是备忘单/参考类型的帖子。
乍一看,笑话似乎有神奇的作用。什么时候执行什么?但如果你想一想,它就会变得明显不那么令人困惑。
也许这些简单的“规则”有帮助:
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>");
这是结果(在我删除其他输出后):
./<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
顶层和描述回调中的所有内容都会立即执行:
./<start> ./describe(foo)/<start> ./describe(foo)/<end> ./describe(bar)/<start> ./describe(bar)/<end> ./<end> [...]
顶层的 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("</all>"); }) aftereach(() => { console.log("</each>"); }) describe("foo", () => { console.log("<describe id=\"foo\">"); beforeall(() => { console.log("<all in=\"foo\">"); }) beforeeach(() => { console.log("<each in=\"foo\">"); }) afterall(() => { console.log("</all> <!-- in=\"foo\" -->"); }) aftereach(() => { console.log("</each> <!-- in=\"foo\" -->"); }) test("testfoo", () => { console.log("<test in=\"foo\" id=\"testfoo\" />"); }) 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("</all> <!-- in=\"barinner\" -->"); }) aftereach(() => { console.log("</each> <!-- in=\"barinner\" -->"); }) test("testbarinner", () => { console.log("<test in=\"barinner\" id=\"testbarinner\" />"); }) 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("</all> <!-- in=\"bar\" -->"); }) aftereach(() => { console.log("</each> <!-- in=\"bar\" -->"); }) test("testbar", () => { console.log("<test in=\"bar\" id=\"testbar\" />"); }) test("testotherbar", () => { console.log("<test in=\"bar\" id=\"testotherbar\" />"); }) 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" /> </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" /> </each> <!-- in="barinner" --> </each> <!-- in="bar" --> </each> </all> <!-- in="barinner" --> <each> <each in="bar"> <test in="bar" id="testBar" /> </each> <!-- in="bar" --> </each> <each> <each in="bar"> <test in="bar" id="otherBar" /> </each> <!-- in="bar" --> </each> </all> <!-- in="bar" --> </all>
这就是关于执行顺序的全部知识。
以上就是笑话回顾:什么时候运行?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号