Жасмин шпионят за функцией, чтобы не вызывать, пока не выполнится какое-то условие - PullRequest
0 голосов
/ 07 июня 2018

Я бы хотел, чтобы функция, за которой я следил, не выполнялась до тех пор, пока не выполнится какое-либо условие.Вот пример:

function openInfoDialog(id) {
    let scope = $scope.$new(true);
    scope.dataLoading = true;
    api.getData(id).then(data => {
        let processedData = process(data);
        scope.columns = processedData.columns;
        scope.data = processedData.data;
        scope.dataLoading = false;
    });
    ngDialog.open({
        //various dialog params,
        scope
    });
}

В моем тесте я пытаюсь проверить, как данные возвращаются функцией process.Единственный способ проверить, как это проверить, - это шпионить за ngDialog.open и проверять, что вызывается.

Однако в моем тесте ngDialog вызывается до завершения функции process, что означает scope.data не определено.

Можно ли как-нибудь сказать ngDialog дождаться завершения блока then в тесте?Или подождите, пока scope.dataLoading не станет true.

Чтобы было ясно, я не хочу менять функциональность моего контроллера, мне нужно протестировать то, что написано выше.

Спасибо за любыепомощь.

1 Ответ

0 голосов
/ 07 июня 2018

Следите за api.getData и имитируйте возврат обещания, который является синхронизированным.

it('should process data', function () {
    var mockedDataObject = { ... };

    spyOn(api, 'getData').and.returnValue({
        then: function () { // Mimic a promise
            return mockedDataObject;
        }
    });

    openInfoDialog(123);

    expect(api.getData).toHaveBeenCalledWith(123);

    expect(scope.columns).toEqual(whateveryouexpect)
    expect(scope.data).toEqual(whateveryouexpect)
    expect(scope.dataLoading).toEqual(whateveryouexpect)
});

PS Вы упомянули, что хотите

проверить, как данные возвращаются процессомfunction

Чтобы сделать это соответствующим образом, сначала свяжите функцию process с scope, чтобы к ней можно было получить доступ из тестов.Во-вторых, вызовите эту функцию напрямую и проверьте, что она вернула.Вы должны тестировать функциональность изолированно.

it('should process data', function () {
    var mockedDataObject = { ... };

    var mockedProcessedData = scope.process(mockedDataObject);

    expect(mockedProcessedData.columns).toEqual(expectedcolumns);
    expect(mockedProcessedData.data).toEqual(expecteddata);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...