2016-12-28 3 views
0

У меня есть метод в файле javascript.Жасмин: проверка функции, вызываемой из другой функции с использованием жасмина

function foo() { 
    setTimeout(function() { 
     bar.getSomeUrl(); 
     },WAIT_FOR_SOMETIME); 
} 

Теперь getSomeUrl() реализован ниже.

var bar = { 
    getSomeUrl : function(){ 
     window.location.href = 'someUrl'; 
     return; 
    }, 
    anotherProp : function() { 
     return bar.getSomeUrl(); 
    } 
}; 

Я пытаюсь проверить, что метод getSomeUrl() будет вызываться, когда я вызываю метод foo().

Я использую жасмин для тестирования. Мой тест жасмин, как показано ниже:

describe('This tests getSomeUrl()', function() { 
    it('is called when foo() is called', function(){ 
     spyOn(bar,'getSomeUrl').and.callFake(function(){}); 

     window.foo(); 
     expect(bar.getSomeUrl).toHaveBeenCalled(); 

    }); 
}); 

Я не забочусь о тестировании Что происходит внутри getSomeUrl(), потому что у меня есть отдельный тест для этого.

Все, что я пытаюсь проверить, это то, что когда я вызываю свой foo() откуда-то, вызывается getSomeUrl().

У меня есть следующие проблемы:

  1. Если я делаю это так, тест не пройден, и в конце выполнения всех тестов, браузер перенаправляет someUrl. Я не ожидал, что это произойдет, потому что я думал, что у меня был шпион на bar.getSomeUrl() и возвращался fake method, он на самом деле не назовет bar.getSomeUrl(), когда я позвоню window.foo().
  2. Так что я подумал, может быть, я должен сделать это, как показано ниже:

    ожидать (window.foo) .toHaveBeenCalled();

Это не имеет смысла, потому что я пытаюсь проверить, что вызывается bar.getSomeUrl().

Однако, когда я сделал это, тест не пройден, и я получаю ошибку ниже:

Error: Expected a spy, but got Function.

Я также думал, что это может быть setTimeout функция, которая вызывает вопрос и изменил функцию foo() на:

function foo() { 
    bar.getSomeUrl(); 
}; 

ничего не изменило

Я работал с Jasmin e и Javascript только в течение нескольких дней и имеют широкое понимание того, как все работает.

Любое предложение пройти тест, а также указатель относительно того, что я делаю неправильно, очень ценится.

+0

это не связано с java. Javascript пишется одним словом и не имеет отношения к Java. –

+0

Понадобился. Благодарю. – ChillBan123

+0

У вас есть синтаксическая ошибка. 'bar.getSomeUrl' является литералом объекта (с недопустимым синтаксисом). Это не функция – Phil

ответ

0

Во-первых, bar.getSomeUrl должен быть функцией, а не (недействительный) объект

var bar = { 
    getSomeUrl : function() { 
     window.location.href = 'someUrl'; 
     return; 
    }, 
    anotherProp : function() { 
     return bar.getSomeUrl(); 
    } 
}; 

Во-вторых, используйте Jasmine Clock при тестировании кода с тайм-аута.

describe('This tests getSomeUrl()', function() { 
    beforeEach(function() { 
     jasmine.clock().install(); 
    }); 

    afterEach(function() { 
     jasmine.clock().uninstall(); 
    }); 

    it('is called when foo() is called', function(){ 
     spyOn(bar,'getSomeUrl').and.callFake(function(){}); 

     foo(); 
     expect(bar.getSomeUrl).not.toHaveBeenCalled(); 

     jasmine.clock().tick(WAIT_FOR_SOMETIME);  
     expect(bar.getSomeUrl).toHaveBeenCalled();  
    }); 
}); 
+0

Спасибо. Я реализовал 'bar.getSomeUrl' как функцию. Это была опечатка, когда вы отправляли вопрос. – ChillBan123

+0

Пробовал предложение. Не помогает. Все еще закончилось перенаправление на 'someUrl'. – ChillBan123

+0

Хорошо, я отладил тестовый бегун в браузере и обнаружил, что получаю исключение: 'Макетные часы не установлены. ' Я выполнил перестройку проекта и попытался снова, и все работает. Спасибо @Phil. Так был ли тест неудачным из-за вызова функции setTimeout? – ChillBan123

Смежные вопросы