对于我的工作,我不得不分叉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)
然后 test / src / test_helpers / index.coffee 中的这个after
函数(以及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()
所以我继续在前一个&#34之后添加了对我的新功能的测试;编辑了没有文件名的附件"测试:
after 20, ->
这(80-90%的时间,但并不总是)失败,错误:"未捕获的TypeError:after不是函数",然后测试(只是我的测试)继续超时。当我删除调用after 20, ->
时,测试通过(我写的所有其他测试总是通过)。
所以很明显我可以删除container.Register<HomeController>();
container.Register<ValueObject>();
container.Register<IValueRepository, SqlValueRepository>();
,但接下来我还有一个难题,就是为什么我的测试失败的东西明显适用于其他测试。谈到回调和超时,我上周才刚刚阅读过关于异步代码的You Don't Know Javascript's部分,所以我确定问题是我无法清楚地了解测试套件是如何进行的使用回调,但对于我的生活,我无法解决问题。