前面的教程:Developing Discourse Plugins - Part 5 - Add an admin interface
您知道 Discourse 有两个大型的代码库测试套件吗?在服务器端,我们的 Ruby 代码有一个使用 rspec 的测试套件。对于浏览器应用程序,我们有一个包含 ember-testing 的 qunit 套件。
假设您已经设置了开发环境,如果您访问 http://localhost:4200/tests URL,您将开始在浏览器中运行 JavaScript 测试套件。一个有趣的地方是,您可以看到它在右下角的一个微型窗口中测试应用程序:
Discourse 应用程序构建时带有大量测试,当您访问 /tests URL 时,这些测试将开始运行。因此,按您正在处理的插件过滤测试可能会很有帮助。您可以通过点击 Plugin 下拉菜单并选择您的插件来在界面中执行此操作:
在您的插件中添加一个验收测试 (Acceptance Test)
首先,请确保您检出了最新版本的 Discourse。从插件运行验收测试是一项相对较新的功能,如果您没有检出最新版本,您的测试将不会显示出来。
对于本文,我将为我们在本系列第 5 部分中编写的 purple-tentacle 插件编写一个验收测试。
添加一个验收测试非常简单,只需在您的插件中添加一个文件即可。创建以下文件:
test/javascripts/acceptance/purple-tentacle-test.js
import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers";
import { click, visit } from "@ember/test-helpers";
import { test } from "qunit";
acceptance("Purple Tentacle", function (needs) {
needs.settings({ purple_tentacle_enabled: true });
needs.user();
test("Purple tentacle button works", async function (assert) {
await visit("/admin/plugins/purple-tentacle");
assert.ok(exists("#show-tentacle"), "it shows the purple tentacle button");
assert.ok(!exists(".tentacle"), "the tentacle is not shown yet");
await click("#show-tentacle");
assert.ok(exists(".tentacle"), "the tentacle wants to rule the world!");
});
});
我试图以清晰的方式编写测试,但如果您以前从未编写过验收测试,这可能会有点令人困惑。我强烈建议您阅读 Ember 文档中关于验收测试的内容,因为其中有许多很棒的信息。
在我们编写的每个测试中,我们需要 assert(断言)一些东西。在我们的测试中,我们想进行几次断言,以检查触手最初是否隐藏,以及在点击按钮后是否显示。
我们想定义一组在执行断言之前要采取的操作。为此,我们使用 await 关键字。使用该关键字,我们会等待每个异步辅助函数执行完毕。
我们的第一个重要操作是:await visit("/admin/plugins/purple-tentacle");。这告诉我们的测试导航到应用程序中的该 URL。该 URL 是显示触手的地方。
访问出现紫色触手按钮的页面后,我们想检查页面上是否存在该按钮,并且触手图像是否尚不存在。
这通过以下断言来完成:
assert.ok(exists("#show-tentacle"), "it shows the purple tentacle button");
assert.ok(!exists(".tentacle"), "the tentacle is not shown yet");
附注: 上一个版本的 purple-tentacle 插件在 handlebars 模板中没有 #show-tentacle 元素 ID。请查看最新版本以跟上进度!
这些测试通过后,就该测试交互了。
下一条命令是 await click('#show-tentacle');,它告诉我们的测试框架我们想点击按钮并显示触手。
在模拟点击按钮后,我们可以通过断言来检查触手是否出现:
assert.ok(exists(".tentacle"), "the tentacle wants to rule the world!");
不是很糟,是吗?您可以通过在开发机器上访问 http://localhost:4200/tests?qunit_single_plugin=purple-tentacle&qunit_skip_core=1 来自己尝试该测试。您应该会非常快地看到紫色触手出现,并且所有测试都将通过。
如果您想使用 PhantomJS 在命令行上运行插件的 qunit 测试,您可以运行
rake plugin:qunit['purple-tentacle']
(其中 purple-tentacle 是您插件的文件夹名称)
调试您的测试
在编写插件时,您的测试可以帮助您识别插件中的问题。当您开发测试或更改插件代码时,测试可能会失败。为了帮助理解原因,Ember 有一些很好的辅助函数:pauseTest() 和 resumeTest()。
要使用它们,请在测试代码中您希望测试暂停的位置添加 await pauseTest()。现在,当您在浏览器中运行测试时,测试将在您添加 pauseTest() 的位置自动暂停。这将为您提供检查页面或查看任何错误以帮助调试问题的机会。
接下来的去向
我不想听起来像个祥林嫂,但是 Ember 文档中关于测试的内容非常棒。您可能还想通过浏览我们的 javascript tests directory 中的测试来看看 Discourse 如何测试各种功能。我们有相当多的示例可以在其中学习。
测试愉快!
更多系列文章
第 1 部分:插件基础
第 2 部分:插件插口 (Plugin Outlets)
第 3 部分:站点设置
第 4 部分:git 设置
第 5 部分:管理界面
第 6 部分:本主题
第 7 部分:发布您的插件
本文档已版本控制 - 在 github 上建议更改。



)