Добавление теста в 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 об асинхронном коде на прошлой неделе, поэтому я уверен, что проблема заключается в моей неспособности четко понять, как набор тестов использует обратные вызовы, но ради жизни я не могу решить это.