繁体   English   中英

如何使用 ts-mockito 模拟命名的 nestjs 记录器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM