Невозможно использовать jest.mock для класса TypeScript - PullRequest
2 голосов
/ 11 марта 2019

Я пытался перейти на страницу ES6 Class Mocks в документации Jest для тестирования метода на классе TypeScript Consumer. Этот класс создает экземпляр объекта Provider и вызывает для него методы, поэтому я хотел бы смоделировать класс Provider.

Структура каталогов:

.
├── __tests__
│   └── consumers
│       └── Consumer.test.ts
└── js
    ├── providers
    │   └── provider.ts
    └── consumers
        └── Consumer.ts

provider.ts:

export class Provider {
    constructor() {}

    public action(params) {
        // do some stuff that we need to mock
        return something;
    }
}

Consumer.ts:

import {Provider} from "../providers/provider";

export class Consumer {
    private provider: Provider;

    constructor() {
        this.provider = new Provider();
    }

    public doSomething() {
        const result = this.provider.action(params);
        // do something with 'result'
    }
}

Моя первая попытка была с "автоматическим макетом" по умолчанию:

Consumer.test.ts

import {Consumer} from "../../js/consumers/Consumer";

jest.mock("../../js/providers/provider");

test("Consumer doSomething", () => {
    // a mock Provider will be instantiated in Consumer's ctor:
    const consumer = new Consumer();

    // however, Provider.action() will return undefined within doSomething()
    consumer.doSomething();
});

Это доказывает, что я могу заменить реальную реализацию фиктивной, но мне нужно убедиться, что Provider.action() возвращает значение, так что в следующем я попытался:

// at some point we can make this return something, but first check it works
const mockAction = jest.fn();
jest.mock("../../js/providers/provider", () => {
  return jest.fn().mockImplementation(() => {
    return {action: mockAction};
  });
});

test("Consumer doSomething", () => {
    // throws TypeError: provider_1.Provider is not a constructor
    const consumer = new Consumer();

    consumer.doSomething();
});

Независимо от того, как я пытался изменить макет, я не могу найти решение, которое позволило бы мне использовать Consumer как обычно из моего теста. Я бы предпочел не создавать «ручные макеты», чтобы сохранять чистоту кодовой базы и варьировать реализацию макетов между тестами.

1 Ответ

0 голосов
/ 11 марта 2019

Кажется, я решил эту проблему, убедившись, что зависимость, которую нужно смоделировать, является экспортом по умолчанию:

Provider.ts * * 1004

export default class Provider {}

Consumer.ts, Consumer.test.ts:

import Provider from "../providers/provider";

Я считаю, что это потому, что jest.mock() предназначен для модуля , а provider - это модуль с классом Provider , определенным внутри него . Без экспорта по умолчанию в этом модуле точная цель для макета неоднозначна. Делая класс экспортом по умолчанию, Jest знает, как использовать его в качестве цели для макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...