Как мне посмеяться над импортом, который мой тестовый класс делает с шуткой? - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь настроить тесты для моей программы сканирования баз данных, и мне не удается заменить метод класса, который я тестирую, импортирует.

Чтобы не записывать слишком много кода, я просто изложу общую форму проблемы. В моей тестовой функции у меня есть:

describe("test",()=>{
  let result1;

  beforeAll(async ()=>{
    await createConnection();
  })

  afterAll(async ()=>{
    getConnection().close();
  })

  test("setup test",async () => {
    result1 = await WeatherController.startForecastAPI();
    expect(result1.status).toBe(Status.SUCCESS);
  })
})

Файл WeatherController.ts (... где был взят код):

...
import AccessTokenService from '../services/AccessTokenService';

export default class WeatherController{
    ...
    static async startForecastAPI(){
           ...
           const accessToken = AccessTokenService.getAccessToken();//get and validate token 
           ...        
    }
}

Внутри класса WeatherController startForecastAPI определяется как статический асинхронный метод. Класс импортирует несколько других классов, в том числе класс AccessTokenService, который используется для получения действительных токенов доступа. AccessTokenService.getAccessToken () должен возвращать объект с несколькими свойствами, которые он получает через запрос http.

Я хочу смоделировать результаты вызова AccessTokenService, но я не вызываю его напрямую в своей тестовой функции, я вызываю WeatherController, а WeatherController вызывает AccessTokenService. Как я могу заменить то, что вызывает WeatherController, когда я тестирую его, но не касаясь кода WeatherController? Я пытался просмотреть шутливые документы, но я довольно новичок во всем этом, и они сбивают с толку. Мне не совсем понятно, как работает область видимости здесь (я пытался определить функцию в тестовом коде и вызвать ее в тестируемой функции, но это выходит за рамки).

Вызов await WeatherController.startForecastAPI () в тестовой функции возвращает неопределенное значение, но код работает нормально, когда я жестко кодирую accessToken как действительный объект, я просто не могу найти способ вставить этот объект в код через функция проверки.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Если AccessTokenService.getAccessToken возвращает обещание или является асинхронной функцией, то вы можете использовать jest.spyOn (...). MockResolvedValue () для предотвращения вызова сервера

describe("test",()=>{
  let result1;

  beforeAll(async ()=>{
    await createConnection();
  })

  afterAll(async ()=>{
    getConnection().close();
  })

  test("setup test",async () => {
    const expectedResultFromGetToken = {property: 'property 1'};
    const getTokenSpy = jest.spyOn(AccessTokenService, 'getAccessToken')
                            .mockResolvedValue(expectedResultFromGetToken)
    result1 = await WeatherController.startForecastAPI();
    expect(result1.status).toBe(Status.SUCCESS);
    expect(getTokenSpy).toHaveBeenCalled()
  })
})

если AccessTokenService.getAccessToken не является асинхронной функцией, тогда вы должны использовать jest.spyOn (...). MockReturnValue ()

0 голосов
/ 12 июня 2019

Если внутри вашего класса у вас есть

const AccessToken = require('access-token');

Вы можете издеваться над этим

jest.mock('access-token', () => {
   function getToken() {
     return 'fakeToken'
   }
);

const WeatherController = require('weather-controller');

describe("test",()=>{
  let result1;

  beforeAll(async ()=>{
    await createConnection();
  })

  afterAll(async ()=>{
    getConnection().close();
  })

  test("setup test",async () => {
    result1 = await WeatherController.startForecastAPI();
    expect(result1.status).toBe(Status.SUCCESS);
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...