我们的项目使用带有mocha、chai和ts-mockito的nestjs进行测试,我不知道如何测试一个命名的nestjs Logger。
new Logger()可以按预期进行测试:
describe('basic test', () => {
it('works', async () => {
const mockLogger = mock<LoggerService>();
const moduleRef = await Test.createTestingModule({
providers: [
{
provide: TestClass,
useValue: new TestClass(),
},
],
})
.setLogger(instance(mockLogger))
.compile();
const unit = moduleRef.get(TestClass);
unit.log();
verify(mockLogger.error(anything())).once();
});
});
class TestClass {
readonly logger: Logger;
constructor() {
this.logger = new Logger();
}
public log() {
this.logger.error(new Error());
}
}但是使用指定的记录器无法通过测试:
class TestClass {
readonly logger: Logger;
constructor() {
this.logger = new Logger('name');
}
public log() {
this.logger.error(new Error());
}
}用// Expected "error(anything())" to be called 1 time(s). But has been called 0 time(s).
发布于 2022-09-15 10:49:26
我设法通过使用capture而不是verify来解决可选的参数问题,例如以前:
verify(mockX.getUsers({key: 'val'}) ).once();之后:
const [opts] = capture(mockX.getUsers).last();
expect(opts).toEqual({key: 'val'});发布于 2022-07-01 11:36:46
这是由于This处理可选函数参数的方式。关于这个问题的一个问题可以找到here。
呼叫
new Logger('name').error(message);实际上与调用
new Logger().error('message', 'name');需要修改模拟,以反映参数中的这种差异。
改变
verify(mockLogger.error(anything())).once();至
verify(mockLogger.error(anything(), anything())).once();解决问题。
https://stackoverflow.com/questions/72828668
复制相似问题