0

对于我的工作,我不得不派生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)

然后aftertest/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 关于异步代码的部分,所以我确定问题是我无法清楚地掌握测试套件是如何使用回调的,但对于我的生活,我无法解决。

4

0 回答 0