测试typescript asyc函数,即使在.then()方法中调用了异步回调,也未调用

时间:2018-09-21 10:47:51

标签: reactjs testing redux jasmine redux-thunk

我一直在寻找解决方案,但是找不到任何东西,我唯一能想到的是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)是对我知道可以通过使用起作用的嘲笑api的调用。

当我运行此测试时,它在指定的30秒DEFAULT_TIMEOUT_INTERVAL后失败两次,一次按预期(根据我的预期),但第二次失败是错误“超时-茉莉花指定的超时内未调用异步回调。DEFAULT_TIMEOUT_INTERVAL。”。

除非我弄错了,否则异步回调是测试中done()函数内expect(actions).toEqual(expectedAction)之后调用的.then()函数。

由于期望失败,.then()肯定正在运行,但似乎没有运行.done()函数,有人能看到为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

最后弄清楚了问题,并在有人遇到类似问题时发布了解决方案。

由于从未遇到失败的expect()语句,因此测试功能一退出,就不会调用Async回调,因此在这种情况下,它实际上从未运行过done()函数。

一旦此测试通过,它将调用done()函数,并且我的测试通过。