Почему .then не работает при тестировании в жасмине - PullRequest
0 голосов
/ 20 марта 2020

У меня есть метод, который возвращает обещание:

joinGame = (playerToken) => {
        let p = new Promise((resolve, reject) => {
            return $.ajax(_path + '/api/Spel/JoinGame/'+playerToken,
                {
                method: 'GET',
                success: (data) => {
                    resolve(data);
                },
                failed: () => {
                    reject('failed');
                }
            });
        });
        return p;
    }

Я использую обещание здесь:

        let tokenPromise = SPA.ResponseModule.getPlayerToken;
        let gamePromise = SPA.ResponseModule.joinGame;

        tokenPromise().then((tokenData) => {
            gamePromise(tokenData['playerToken']).then((gameData) => {
                ...
            });
        });

Код работает нормально при игре в игру. Код тестирования выглядит следующим образом:

 describe("init", () => {

            beforeAll(() => {
                spyOn(SPA.ResponseModule, "getPlayerToken").and.callFake(() => {
                    let d = $.Deferred();
                    let data = {
                        ...
                    }
                    d.resolve(data)
                    return d.promise();
                });

                spyOn(SPA.ResponseModule, "joinGame").and.callFake((token) => {
                    let d = $.Deferred();
                    let data = {
                        ...
                    };
                    d.resolve(data);
                    return d.promise
                });
            });

            beforeEach(() => {
                jasmine.Ajax.install();
                SPA.init();
            });

            afterEach(() => {
                jasmine.Ajax.uninstall();
            });


            it ("SPA.ResponseModule's getPlayerToken should be called", () => {
                expect(SPA.ResponseModule.getPlayerToken).toHaveBeenCalled();
            });


            it ("SPA.ResponseModule's joinGame should be called", () => {
                expect(SPA.ResponseModule.joinGame).toHaveBeenCalledWith(playerToken);
            });
        });

50% случаев, когда второе ожидание SPA.ResponseModule.joinGame не выполняется нормально, а 50% - работает. При каждом ожидании запуска SPA.init, в котором используется обещание, я получаю сообщение об ошибке gamePromise (...). Тогда это не функция . Предполагается, что проблема заключается в том, что gamePromise не возвращает обещание, но оно возвращает. Что здесь не так? Должен ли я издеваться над звонками?

1 Ответ

0 голосов
/ 20 марта 2020

Я думаю, вам не следует возвращаться, а просто вызывать $. ajax в функции joinGame, поскольку она уже вызывает разрешение / отклонение при разрешении.

...