JasmineJS + AngularJS: как смоделировать задержку внутри Spy # callFake () - PullRequest
0 голосов
/ 22 января 2019

Предположим, у меня есть сервисная функция, которая возвращает мне текущее местоположение.И функция имеет обратные вызовы, чтобы вернуть местоположение.Мы можем легко mock функцию, как показано ниже.Но я хотел ввести некоторую задержку (скажем, 1 секунду), прежде чем callFake() вызовет successHandler (location).

Есть ли способ достичь этого?

xxxSpec.js

spyOn(LocationService, 'getLocation').and.callFake(function(successHandler, errorHandler) {

   //TODO: introduce some delay here

   const location = {...};
   successHandler(location); 
}

LocationService.js

function getLocation(successCallback, errorCallback) {
    let location = {...};
    successCallback(location);
}

1 Ответ

0 голосов
/ 22 января 2019

Введение задержки в Javascript легко сделать с помощью API setTimeout, подробности здесь .Вы не указали, используете ли вы фреймворк, такой как Angular, поэтому ваш код может немного отличаться от того, что у меня есть ниже.

Не похоже, что вы используете Observables или Promises для упрощения обработки асинхронного кода.,У Jasmine 2 есть обратный вызов «done», который может быть полезен для этого.Примерно так может работать:

it( "my test", function(done) {
    let successHandler = jasmine.createSpy();
    spyOn(LocationService, 'getLocation').and.callFake(function(successHandler, errorHandler) {
        setTimeout(function() {
            const location = {...};
            successHandler(location); 
        }, 1000); // wait for 1 second
    })

    // Now invoke the function under test
    functionUnderTest(/* location data */);

    // To test we have to wait until it's completed before expecting...
    setTimeout(function(){
        // check what you want to check in the test ...
        expect(successHandler).toHaveBeenCalled();
        // Let Jasmine know the test is done.
        done();
    }, 1500); // wait for longer than one second to test results
});

Однако мне не ясно, почему добавление тайм-аутов было бы полезно для вашего тестирования.:)

Надеюсь, это поможет.

...