[英]How to mock a named nestjs Logger with ts-mockito
我们的项目使用带有 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());
}
}
with // Expected "error(anything())" to be called 1 time(s). But has been called 0 time(s).
// Expected "error(anything())" to be called 1 time(s). But has been called 0 time(s).
我设法通过使用capture
而不是verify
来解决可选参数问题,例如之前:
verify(mockX.getUsers({key: 'val'}) ).once();
后:
const [opts] = capture(mockX.getUsers).last();
expect(opts).toEqual({key: 'val'});
这是由于 ts-mockito 处理可选 function arguments 的方式。 可以在此处找到有关此问题的问题
打电话
new Logger('name').error(message);
实际上与调用相同
new Logger().error('message', 'name');
并且需要更改模拟以反映 arguments 中的这种差异。
改变
verify(mockLogger.error(anything())).once();
至
verify(mockLogger.error(anything(), anything())).once();
解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.