我有一个控制器,它通过控制器构造函数中的依赖项注入使用 NestJS 内置 Logger:
constructor(private readonly logger: Logger)
Run Code Online (Sandbox Code Playgroud)
我希望能够在 Jest 测试中模拟它,以查看在日志记录期间调用了哪些方法以及使用哪些参数。我尝试了这个语法:
providers[{
provide: Logger,
useValue: {
log: jest.fn(),
}
}]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这一行:
expect(Logger).toHaveBeenCalledTimes(1);
Run Code Online (Sandbox Code Playgroud)
返回: 匹配器错误:接收到的值必须是模拟或间谍函数
任何帮助将不胜感激!
Jay*_*iel 13
在您的测试中,您应该使用(或非常类似的东西)将记录器从 DI 上下文中恢复出来moduleFixture.get(Logger),然后检查expect(logger.log).toHaveBeenCalledTimes(1). Logger它本身是一个类,而不是间谍或模拟,所以 Jest 不知道如何处理它。
有效的完整解决方案:
import { Test } from '@nestjs/testing';
let logger: Logger;
beforeEach(async () => {
const moduleRef = await Test.createTestingModule({
providers: [
{
provide: Logger,
useValue: {
log: jest.fn(),
},
},
],
}).compile();
logger = moduleRef.get<Logger>(Logger);
});
Run Code Online (Sandbox Code Playgroud)
然后在测试本身中:
expect(logger.log).toHaveBeenCalledTimes(1);
expect(logger.log).toHaveBeenCalledWith('Your log message here')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10122 次 |
| 最近记录: |