как издеваться над глобальной переменной в мокко? - PullRequest
1 голос
/ 19 июня 2020

У меня есть файл со следующим кодом:

**in file.ts**

let gateways = new Map<string, Set<number>>();

    export const handler = async (event: any = {}): Promise<any> => {
          let gws: Set<number> | undefined = gateways.get(action);
          console.log(gws)
          return gws
        }

создается экземпляр переменной gateways и устанавливается значение из другого механизма.
Я пишу модульный тест для функции обработчика и нужно имитировать переменную gateways, чтобы она возвращала фиктивное значение при вызове gateways.get(). Есть ли способ добиться этого ?? Я пробовал использовать модуль rewire, но он не работает. Ниже приведен пример модульного теста. :

import * as mocha from 'mocha'
import {Substitute, Arg} from '@fluffy-spoon/substitute'
import {handler} from './helpers'
import rewire from 'rewire'
const helper = rewire('./helpers')
helper.__set__('gateways', [1, 2, 3, 4, 5, 6, 7, 8])

describe('test', () => {
  before(() => {
  })
  it('testing handler', () => {
      const result = handler('')
  })
})

1 Ответ

1 голос
/ 19 июня 2020

Так как переменная gateway на самом деле не global (она только «глобальная» в модуле file.ts), вы не можете напрямую имитировать ее извне (я не работал с rewire, возможно, это разрешить это). Но есть более простой способ сделать это, не полагаясь на дополнительную библиотеку:

Как насчет того, чтобы обернуть вашу handler функцию в класс и определить метод для инкапсуляции доступа к Map? В своем модульном тесте вы можете просто перезаписать / имитировать поведение этого метода. Что-то вроде:

export class EventHandler {
  private gateways = new Map<string, Set<number>>();

  async handler (event: any = {}): Promise<any> {
       // obtain action
       const action = await ...;
       const gws: Set<number> | undefined = this.getAction(action);
       console.log(gws)
       return gws;
  }

  getAction(action) {
    return this.gateways.get(action);
  }


}

Затем в своем модульном тесте вы можете просто переопределить getAction вручную или использовать Sinon для создания заглушки. Вот как это сделать вручную:

describe('EventHandler', () => {
  it('handler should correctly return values', async () => {
    const eventHandler = new EventHandler();

    // mock behaviour of `getAction`
    eventHandler.getAction = () => [1, 2, 3, 4, 5, 6, 7, 8];

    const result = await eventHandler.handler('');
    expect(result).to.eql([1, 2, 3, 4, 5, 6, 7, 8]);
  });
});
...