Пакет не активируется при запуске спецификации - PullRequest
0 голосов
/ 17 октября 2019

Я создал пакет для Atom с именем quick-fold , который переходит к следующей складываемой строке и сворачивает ее по команде quick-fold:fold-next. Я хотел начать знакомство со спецификациями Atom, чтобы можно было запускать тесты для этого пакета, однако я столкнулся с этой проблемой, когда пакет просто не активируется при запуске спецификаций.

quick-fold-spec.js:

describe('QuickFold package', () => {

    let editor, editorView;

    beforeEach(async () => {
        await atom.packages.activatePackage('language-javascript');
        await atom.workspace.open('sample.js');

        editor = atom.workspace.getActiveTextEditor();
        editorView = atom.views.getView(editor);
    });

    describe('when the specs are run', () => {
        it('opens the sample file', () => expect(!editor.isEmpty()).toBe(true));
        // true
    });

    describe('when the quick-fold:fold-next event is triggered', () => {
        beforeEach(async () => {
            // Try to activate package by dispatching command:
            atom.commands.dispatch(editorView, 'quick-fold:fold-next');
            await atom.packages.activatePackage('quick-fold'); // Never resolves
        });

        it('activates the package', () => {
            expect(atom.packages.isPackageActive('quick-fold')).toBe(true);
        });

        it('moves the cursor to a different line number', () => {
            expect(editor.getCursorScreenPosition().row).not.toBe(0);
        });
    });
});

Но atom.packages.activatePackage('quick-fold') никогда не разрешается. Пакет не активируется и вместо него истекает время ожидания:

timeout: timed out after 5000 msec waiting for spec promise to resolve

Spec suite screenshot

Команда активации установлена ​​в package.json:

  "activationCommands": {
    "atom-workspace": "quick-fold:fold-next"
  },

, поэтому отправка должна активировать пакет, а затем await atom.packages.activatePackage('quick-fold') должен разрешиться. Но положение курсора не меняется, и пакет не активируется.

(Обратите внимание, что atom.packages.activatePackage('quick-fold') - это просто обещание - он не активирует пакет, но разрешается, когда пакет активируется. )

1 Ответ

0 голосов
/ 17 октября 2019

Как это часто бывает, я в конце концов понял это ...

1. В функции beforeEach() отсутствует runs()

Это должно быть

    beforeEach(async () => {
        await atom.packages.activatePackage('language-javascript');
        await atom.workspace.open('sample.js');

        runs(() => {
            editor = atom.workspace.getActiveTextEditor();
            editorView = atom.views.getView(editor);

            return activationPromise = atom.packages.activatePackage('quick-fold');
        });
    });

, где функция runs() возвращает обещание при активации пакета.

Начиная с документы :

Спецификации записываются путем определения набора блоков с вызовами на runs, которые обычно заканчиваются асинхронным вызовом.

Я слишком устал сейчас, чтобы понять, что это значит, но это звучит правдоподобно.

2. Команды активации в package.json должны основываться на atom-text-editor

То есть, а не atom-workspace

  "activationCommands": {
    "atom-text-editor": "quick-fold:fold-next"
  },

Это, вероятно, потому что у нас есть atom.commands.dispatch(editorView, 'quick-fold:fold-next'), куда команды отправляютсяeditorView = atom.views.getView(editor) вместо рабочего пространства Atom.


Рефакторинг - «стандартный» способ сделать это

describe('QuickFold package', () => {

    let editor, editorView, activationPromise;

    const foldNext = async (callback) => {
        atom.commands.dispatch(editorView, 'quick-fold:fold-next');
        await activationPromise;
        return callback();
    };

    beforeEach(async () => {
        await atom.packages.activatePackage('language-javascript');
        await atom.workspace.open('sample.js');

        runs(() => {
            editor = atom.workspace.getActiveTextEditor();
            editorView = atom.views.getView(editor);

            return activationPromise = atom.packages.activatePackage('quick-fold');
        });
    });

    describe('when the specs are run', () => {
        it('opens the sample file', () => expect(!editor.isEmpty()).toBe(true));
    });

    describe('when the quick-fold:fold-next event is triggered', () => {
        it('activates the package', () => {
            return foldNext(() => expect(atom.packages.isPackageActive('quick-fold')).toBe(true));
        });

        it('moves the cursor to a different line number', () => {
            return foldNext(() => expect(editor.getCursorScreenPosition().row).not.toBe(0));
        });
    });
});
...