Как я могу следить за функцией, экспортированной из модуля в Jasmine 2?

Исходный код

  import lookupFooFunction from '../../utils/sampleJSFile';
    function a() {
      const a = 'bla';
      const b = 'zoo';
      lookupFooFunction(a,b) 
      //more stuff
    }

Тестовый код

spyOn(window, 'lookupFooFunction');
expect(viewInstance.caFormView.lookupStarRewardsPhone).toHaveBeenCalledWith('bla','zoo');

Я хочу иметь возможность отслеживать мой вызов lookupFooFunction и использовать toHaveBeenCalledWith, но поскольку lookupFooFunction не является объектом, я не могу понять, как это сделать.

Когда я делаю это, я получаю сообщение об ошибке Ошибка: метод lookupFooFunction() не существует.

Погуглил и обнаружил, что объект окна не должен работать, потому что у меня та же проблема, что и у этого человека здесь https://groups.google.com/forum/#!topic/jasmine-js/a3gNCMMd3UM Однако мне не удалось заставить все работать с jasmine. createSpy, и мне не ясно, сработает ли такой подход.


person Gwater17    schedule 20.03.2018    source источник
comment
В итоге я изменил свой код, чтобы экспортировать объект с моей функцией в качестве свойства.   -  person Gwater17    schedule 20.03.2018


Ответы (1)


If

spyOn(window, 'lookupFooFunction');

не работает, вы можете использовать

lookupFooFunction = jasmine.createSpy();

в качестве альтернативного синтаксиса Jasmine для создания шпиона. Вот CodePen, чтобы поэкспериментировать с ним, если средство запуска кода StackOverflow не работает.

// This will be imported, but is stubbed here
function lookupFooFunction(a, b) {
  return 123;
}

function a() {
  const a = 'bla';
  const b = 'zoo';
  lookupFooFunction(a, b);
}

it('test', () => {
  // Arrange - spy with jasmine.createSpy() or spyOn(window, 'lookupFooFunction')
  lookupFooFunction = jasmine.createSpy();
  //spyOn(window, 'lookupFooFunction');
  
  // Act
  a();
  
  // Assert
  expect(window.lookupFooFunction).toHaveBeenCalledWith('bla', 'zoo');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.99.2/jasmine.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.99.2/jasmine-html.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.99.2/boot.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.99.2/jasmine.min.css" rel="stylesheet"/>

person Joe Wilson    schedule 20.03.2018
comment
Хм. У меня это тоже не работает. Я также получаю сообщение об ошибке, когда запускаю ваш фрагмент кода. Кроме того, я использую Jasmine 2.99. - person Gwater17; 20.03.2018
comment
Когда я использую jasmine.createSpy, я получаю сообщение об ошибке Uncaught Error: ‹toHaveBeenCalledWith›: ожидается шпион, но он не определен. - person Gwater17; 20.03.2018
comment
Я не уверен, что происходит, потому что он не работает с переполнением стека. Я изменил фреймворк на 2.99.2, и он все еще работает для меня в Chrome (последняя версия). Я добавил CodePen, чтобы вам было проще с ним поиграться. Я также добавил притворный lookupFooFunction, чтобы имитировать тот, который вы импортируете. - person Joe Wilson; 21.03.2018