Могу ли я издеваться / шпионить за значением переменной, которое существует в родительской области действия не чистой функции? - PullRequest
0 голосов
/ 19 марта 2020
let state = 'Monday';
export function greet() {
  return 'hello ' + state;
}

↑ При хорошей практике кодирования вы не столкнетесь с не чистыми функциями, подобными этой, но по некоторым особым причинам, которые я сделал.

Затем с шуткой:

import { greet } from './functions';

test('a', () => {
  expect(greet()).toBe('hello Monday');
});

test('b', () => {
  let state = 'Tuesday';
  expect(greet()).toBe('hello Tuesday'); // fail! Still 'hello Monday'
});

В таком случае, как я могу издеваться над состоянием?

1 Ответ

1 голос
/ 20 марта 2020

Вы можете использовать rewire для замены закрытой переменной, определенной в области видимости модуля, на фиктивную.

Текущая версия rewire совместима только с Common JS модули. см. ограничения

Поэтому в приведенном ниже примере измените модуль ES на Общие JS модули.

Например, functions.js:

let state = 'Monday';
function greet() {
  return 'hello ' + state;
}

exports.greet = greet;

functions.test.js:

const rewire = require('rewire');
const functions = rewire('./functions');

describe('60763037', () => {
  test('a', () => {
    expect(functions.greet()).toBe('hello Monday');
  });

  test('b', () => {
    functions.__set__('state', 'Tuesday');
    expect(functions.greet()).toBe('hello Tuesday');
  });
});

Результаты модульных испытаний:

 PASS  stackoverflow/60763037/functions.test.js
  60763037
    ✓ a (3ms)
    ✓ b (1ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        5.04s
...