Шутный шпионский метод - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть такой шутник

    import * as source from '../source
      ("Spy on a method", ()=>{
        const spy = jest.spyOn(source, 'toBeCalledOn')
        const result = source.entrypoint(0);
        expect(source.toBeCalledOn()).toHaveBeenCalled();
        })

В моем srcjs

export const entrypoint = (input)=>{
    toBeCalledOn(input)
}


const toBeCalledOn =(input)=>{
    console.log();
}

Я ожидаю, что toBeCalledOn пройдет мой шутный тест, но я всегда терплю неудачу -

Expected toBeCalledOn toHaveBeenCalled but wasn't

Как я могу использовать jestspy, чтобы увидеть, был ли вызван метод при определенных условиях, например, как оператор if?

Поправьте меня, если я ошибаюсь, но какой смысл вызывать метод только для проверки, был ли он вызван, для меня это кажется довольно очевидным.

1 Ответ

0 голосов
/ 18 февраля 2019

Вы должны ожидать, что утверждение для функции spyied не является действительной функцией.

Когда вы spy для функции, действительная функция никогда не вызывается.

import * as source from '../source'; #import source object or all functions inside of it

describe('Spy on a method', () => {
  it('toBeCalledOn to have been called', () => {
    const spy = jest.spyOn(source, 'toBeCalledOn')
    const result = source.entrypoint(0);
    expect(spy).toHaveBeenCalledTimes(1);
    expect(spy).toHaveBeenCalledWith(0);
  })
});

Если вы хотите проверить условие, вы также должны покрыть ветви, возникшие из-за этой функции.

Если у вас есть if иelse, тогда вам придется написать 2 теста.Пожалуйста, смотрите пример ниже.

export const entrypoint = (input)=>{
  if(input !== 0){
    toBeCalledOn(input);
  }
}

const toBeCalledOn =(input)=>{
    console.log('logs something');
}

import * as source from '../source

describe('Spy on a method', () => {
  it('toBeCalledOn not to be called', () => {
    const spy = jest.spyOn(source, 'toBeCalledOn')
    const result = source.entrypoint(0);
    expect(spy).not.toHaveBeenCalled();
  });
  
  it('toBeCalledOn to have been called', () => {
    const spy = jest.spyOn(source, 'toBeCalledOn')
    const result = source.entrypoint(1);
    expect(spy).toHaveBeenCalledTimes(1);
    expect(spy).toHaveBeenCalledWith(1);
  });
});

Отвечая на ваш другой запрос, я бы сказал, что мы должны assert вещи, которые были бы очевидны.В случае, если кто-то вносит какие-либо изменения в код, и если он нарушает предыдущий поток, в этом случае вы можете обнаружить ошибку в контрольном примере.

Именно поэтому мы пишем контрольные примеры.

Также попробуйте добавить строгие утверждения, чтобы провести надежное тестирование.Например, вместо toHaveBeenCalled вы можете использовать функцию toHaveBeenCalledTimes, чтобы сделать утверждение более строгим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...