Добавление теста в Trix, вспомогательный метод не является функцией

Для моей работы мне пришлось раскошелиться на редактор 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 не является функцией", и затем тест (только мой тест) переходит к тайм-ауту. Когда я уберу звонок after 20, ->тест проходит успешно (все остальные тесты, которые я не писал, всегда проходят).

Итак, очевидно, я мог бы просто удалить after 20, ->, но потом я остаюсь с загадкой, почему мой тест проваливается на чем-то, что явно работает для других тестов. Когда дело доходит до обратных вызовов и тайм-аутов, я только что читал раздел " Не знаю" Javascript об асинхронном коде на прошлой неделе, поэтому я уверен, что проблема заключается в моей неспособности четко понять, как набор тестов использует обратные вызовы, но ради жизни я не могу решить это.

0 ответов

Другие вопросы по тегам