Я пытаюсь протестировать модуль, который выглядит примерно так
import { Countdown } from "./database/orm";
export class PersistentTimer {
protected constructor(...) { ... }
// This object requires writing to a database, so I protect the constructor and
// force construction through an async interface
public static async create(...) {
const entity = new Countdown();
// do stuff
await entity.save();
return new PersistentTimer(entity);
}
}
Я ищу что-то вроде jest.mock
в экосистеме мокко, чтобы издеваться над модулем обратного отсчета, поскольку у него есть побочный эффект, чтобы я мог провести модульное тестирование этого модуля. Sinon, похоже, имеет дело только с функциями, свойствами объектов или экземплярами объектов, передаваемыми в вызовы функций.
Вы можете заглушить ./database/orm
модуль с стыковыми швами.
Это версия CommonJS, поэтому мы будем использовать proxyquire для построения наших швов.
Например.
main.ts
:
import { Countdown } from './database/orm';
export class PersistentTimer {
protected constructor(entity: Countdown) {}
public static async create() {
const entity = new Countdown();
await entity.save();
return new PersistentTimer(entity);
}
}
main.test.ts
:
import sinon from 'sinon';
import proxyquire from 'proxyquire';
import { expect } from 'chai';
describe('65399764', () => {
it('should pass', async () => {
const countdownInstanceStub = {
save: sinon.stub(),
};
const CountdownStub = sinon.stub().returns(countdownInstanceStub);
const { PersistentTimer } = proxyquire('./main.ts', {
'./database/orm': {
Countdown: CountdownStub,
},
});
const persistentTimer = await PersistentTimer.create();
sinon.assert.calledOnce(CountdownStub);
sinon.assert.calledOnce(countdownInstanceStub.save);
expect(persistentTimer).to.be.instanceOf(PersistentTimer);
});
});
результат модульного теста:
65399764
✓ should pass (1848ms)
1 passing (2s)
-------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-------------------|---------|----------|---------|---------|-------------------
All files | 85.71 | 100 | 66.67 | 85.71 |
65399764 | 100 | 100 | 100 | 100 |
main.ts | 100 | 100 | 100 | 100 |
65399764/database | 50 | 100 | 0 | 50 |
orm.ts | 50 | 100 | 0 | 50 | 3
-------------------|---------|----------|---------|---------|-------------------
Еще раз спасибо за ссылку. Я обнаружил, что proxyquire в конечном итоге полностью стирает типы (импортированный модуль имеет тип any, что портит некоторые тестовые приложения), но я смог использовать общий принцип соединения ссылок там, где это не сработало.
Отвечает ли это на ваш вопрос? Как имитировать модуль npm с помощью sinon/mocha