对于我的工作,我不得不派生Trix WYSIWYG编辑器并开始添加我知道不会被基础项目接受的新功能。我有一个功能允许用户在编辑器中左/右对齐嵌入的图像。
我的问题是关于测试的。Trix 代码库使用 QUnit,并使用自定义助手进行了一系列系统测试。对于上下文:我是 Rails 后端开发人员。这不是我的领域,我的实现可能非常笨拙。
我添加了一个系统测试,它使用与它所在文件中的其他测试相同的格式,并且正在努力理解为什么会出现错误。
因此,他们的一项测试(我没有编写并且始终通过)是这样编写的:
{after, assert, clickElement, defer, dragToCoordinates, moveCursor, pressKey, test, testGroup, triggerEvent, typeCharacters} = Trix.TestHelpers
...
test "editing an attachment caption with no filename", (done) ->
after 20, ->
# asserts about caption content
clickElement getFigure(), ->
# assertions about caption content after clicking on figure
done()
此文件中的所有测试都遵循类似的格式,即使用作为第二个参数传递的回调test
(通常是)并在测试内容之前done
调用。after 20, ->
我发现有两个相关的辅助函数与这个测试的编写方式有关。一个在文件test/src/test_helpers/test_helpers.coffee 中
helpers = Trix.TestHelpers
# a few functions
helpers.extend
test: (name, callback) ->
QUnit.test name, (assert) ->
doneAsync = assert.async()
ready (element) ->
done = (expectedDocumentValue) ->
if element?
if expectedDocumentValue
assert.equal element.editor.getDocument().toString(), expectedDocumentValue
requestAnimationFrame(doneAsync)
else
doneAsync()
if callback.length is 0
callback()
done()
else
callback(done)
然后after
在test/src/test_helpers/index.coffee中有这个函数(连同这个defer
函数,它也被其他通过的测试使用):
# Remove QUnit's globals
delete window[key] for key, value of QUnit when window[key] is value
Trix.TestHelpers = helpers =
...
after: (delay, callback) ->
setTimeout(callback, delay)
defer: (callback) ->
setTimeout(callback, 1)
所以我继续在之前的“编辑没有文件名的附件”测试之后为我的新功能添加了一个测试:
test "aligning and re-aligning an attachment", (done) ->
after 20, ->
# some assertions
clickElement getFigure(), ->
# define left/right/clear alignment buttons
clickElement leftAlignButton, ->
# assertion
defer ->
clickElement clearAlignButton, ->
# assertion
defer ->
clickElement rightAlignButton, ->
# assertion
done()
这(80-90% 的时间,但并非总是如此)失败,并出现错误:“Uncaught TypeError: after is not a function”,然后测试(只是我的测试)继续超时。当我删除 callafter 20, ->
时,测试通过(我没有编写的所有其他测试总是通过)。
所以很明显我可以删除after 20, ->
,但是我留下了一个难题,为什么我的测试在显然适用于其他测试的东西上失败了。谈到回调和超时,上周我才刚刚阅读You Don't Know Javascript 关于异步代码的部分,所以我确定问题是我无法清楚地掌握测试套件是如何使用回调的,但对于我的生活,我无法解决。