невозможно издеваться над вызовом выборки с помощью библиотеки «fetch-mock-jest 1.5.1»

#node.js #typescript #jestjs #fetch

Вопрос:

Я пытаюсь издеваться над вызовом выборки, используя эту шутку, но код все равно пытается перейти на удаленный адрес и в конечном итоге выдает сообщение об ошибке FetchError: request to https://some.domain.io/app-config.yaml failed, reason: getaddrinfo ENOTFOUND some.domain.io] .

Вот тестовый код

 import { AppConfig } from '@backstage/config';
import { loadConfig } from './loader';
import mockFs from 'mock-fs';
import fetchMock from 'fetch-mock-jest';

describe('loadConfig', () => {
  beforeEach(() => {
    fetchMock.mock({
      matcher: '*',
      response: `app:
          title: Example App
          sessionKey: 'abc123'
      `
    });
  });

  afterEach(() => {
    fetchMock.mockReset();
  });

  it('load config from remote path', async () => {
    const configUrl = 'https://some.domain.io/app-config.yaml';

    await expect(
       loadConfig({
        configRoot: '/root',
        configTargets: [{ url: configUrl }],
        env: 'production',
        remote: {
          reloadIntervalSeconds: 30,
        },
      })
    ).resolves.toEqual([
      {
        context: configUrl,
        data: {
          app: {
            title: 'Example App',
            sessionKey: 'abc123',
          },
        },
      },
    ]);
    expect(fetchMock).toHaveBeenCalledTimes(1);
  });

  function defer<T>() {
    let resolve: (value: T) => void;
    const promise = new Promise<T>(_resolve => {
      resolve = _resolve;
    });
    return { promise, resolve: resolve! };
  }
});
 

loadConfig имеет код выборки, который я пытаюсь высмеять.

 export async function loadConfig(
  options: LoadConfigOptions,
): Promise<AppConfig[]> {
  const loadRemoteConfigFiles = async () => {
    const configs: AppConfig[] = [];

    const readConfigFromUrl = async (remoteConfigProp: RemoteConfigProp) => {
      const response = await fetch(remoteConfigProp.url);
      if (!response.ok) {
        throw new Error(
          `Could not read config file at ${remoteConfigProp.url}`,
        );
      }

      remoteConfigProp.oldETag = remoteConfigProp.newETag ?? undefined;
      remoteConfigProp.newETag =
        response.headers.get(HTTP_RESPONSE_HEADER_ETAG) ?? undefined;
      remoteConfigProp.content = await response.text();

      return remoteConfigProp;
    };

.......
    return configs;

}

let remoteConfigs: AppConfig[] = [];
  if (remote) {
    try {
      remoteConfigs = await loadRemoteConfigFiles();
    } catch (error) {
      throw new Error(`Failed to read remote configuration file, ${error}`);
    }
  }

........ do some stuff with config then return
return remoteConfigs;
}

 

Конфигурация представляет собой файл yaml, который в конечном итоге анализируется и преобразуется в объект конфигурации.

Есть идеи, почему он не может издеваться над вызовом выборки?

Ответ №1:

замененный

 import fetchMock from 'fetch-mock-jest';

 

с

 const fetchMock = require('fetch-mock').sandbox();
const nodeFetch = require('node-fetch');
nodeFetch.default = fetchMock;
 

и fetchMock.mockReset(); с fetchMock.restore();