При тестировании асинхронных функций машинописного текста, асинхронный обратный вызов не вызывался, даже если он вызывался в методе .then (). - PullRequest
0 голосов
/ 21 сентября 2018

Я какое-то время искал решение этой проблемы, но ничего не могу найти, единственное, о чем я могу подумать, это redux-mock-store, не поддерживающий Promises.

У меня есть этот метод тестирования ниже.

import thunk from 'redux-thunk';
import configureMockStore from 'redux-mock-store';
import { cleanAll } from 'nock';

var middleware = [thunk];
var mockStore = configureMockStore(middleware);

describe('Organisation thunk actions', () => {
    afterAll(() => {
        cleanAll();
    });

    describe('getOrganisation', () => {
        test('should create BEGIN_GET_ORGANISATION_AJAX action when getting organsation', (done: any) => {
            jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
            var expectedAction = [{ type: types.BEGIN_GET_ORGANISATION_AJAX }];
            var store = mockStore({});
            store.dispatch<any>((OrganisationActions.getOrganisation("e"))).then(() => {
                var actions = store.getActions();
                expect(actions).toEqual(expectedAction);
                done();
            });
        });
    });
});

Это разработано для проверки действия ниже.

export const getOrganisation = (organisationId: string, expands?: string[]) => {
    return (dispatch: any) => {
        dispatch(beginGetOrganisationAjax());
            return OrganisationApi.getOrganisationAsync(organisationId).then((organisation: any) =>     {
            dispatch(getOrganisationSuccess(organisation))
        }).catch(error => {
            throw (error);
        });
    }
}

Где OrganisationApi.getOrganisationAsync(organisationId) - вызов mockApiчто я знаю работает от использования.

Когда я запускаю этот тест, он проваливается дважды после 30-секундного DEFAULT_TIMEOUT_INTERVAL, один раз, как и ожидалось (как я и рассчитывал), но второй сбой является ошибкойопределяется jasmine.DEFAULT_TIMEOUT_INTERVAL. ".

Если я не ошибаюсь, асинхронный обратный вызов - это функция done(), вызываемая после expect(actions).toEqual(expectedAction) в функции .then() в тесте.

Поскольку ожидаемый сбой не определен, .then() определенно работает, но, похоже, не выполняет функцию .done(), кто-нибудь может понять, почему это может происходить?

1 Ответ

0 голосов
/ 24 сентября 2018

Наконец-то разобрался с проблемой, опубликовав разрешение на случай, если у кого-то возникнет аналогичная проблема.

Асинхронный обратный вызов никогда не вызывается, поскольку тестовая функция завершает работу, как только сталкивается с ошибочным оператором expect(), поэтому в этом случае он никогда фактически не запускает функцию done().

Как только этот тест проходит, он вызывает функцию done(), и мои тесты проходят.

...