Jest: Мокинг статических методов класса

Созданный на 5 июл. 2016  ·  3Комментарии  ·  Источник: facebook/jest

Я столкнулся с проблемой, пытаясь имитировать статический метод класса в Jest. Поддерживается ли такое поведение?

Перекрестно размещено на http://stackoverflow.com/questions/38206478/mocking-methods-in-jest

У меня есть очень простой модульный тест, который выглядит так:

import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')

describe('Helper', () => {
    let Helper;

    beforeEach(() => {
        Helper = require('../helper').default;
    });

    it('calls the Api Wrapper', () => {
        Helper.help()

        expect(ApiWrapper.help).toHaveBeenCalled();
    });

});

Где Helper выглядит так:

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

А ApiWrapper выглядит так:

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

Jest издевается над ApiWrapper.help (), так что «помогите!» никогда не печатается, но ожидания в тесте не оправдываются. Это все равно не удастся, если мы перепишем ApiWrapper, чтобы он был простым объектом Javascript, например таким:

export default {
    help: () => { console.log('help!'); }
}

Однако это сработает, если мы изменим импорт в спецификации (так, чтобы ApiWrapper был импортирован в beforeEach), и перепишем ApiWrapper как класс Singleton, например:

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

Что в насмешливом поведении Джеста заставляет это происходить?

Самый полезный комментарий

Jest сбрасывает реестр модуля при каждом вызове до it . Вам требуется ApiWrapper сверху и Helper внутри перед каждым, поэтому Helper, вероятно, получит другую копию ApiWrapper . Чтобы исправить это, вы можете:

  • Импортируйте оба класса вверху.
  • Требовать оба класса в beforeEach

Упрощенное объяснение:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Сообщите мне, если это не решит вашу проблему.

Все 3 Комментарий

Правильное утверждение должно быть toBeCalled . Вы можете это попробовать?

Простите, я это имел в виду. Я набрал пример непосредственно в Stackoverflow.

Jest сбрасывает реестр модуля при каждом вызове до it . Вам требуется ApiWrapper сверху и Helper внутри перед каждым, поэтому Helper, вероятно, получит другую копию ApiWrapper . Чтобы исправить это, вы можете:

  • Импортируйте оба класса вверху.
  • Требовать оба класса в beforeEach

Упрощенное объяснение:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Сообщите мне, если это не решит вашу проблему.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги