i.b*_*rod 6 javascript dependency-injection typescript nestjs
我正在使用 NestJs 和 Typeorm,正常设置。UsersService 获取注入的 Typeorm 存储库:
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
Run Code Online (Sandbox Code Playgroud)
在用户模块中:
@Module({
imports:[ TypeOrmModule.forFeature([User])],
controllers: [UsersController ],
providers: [UsersService]
})
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,没有什么特别的。但无论我做什么,自动生成的 UsersService 测试都会失败:
describe('UsersService', () => {
let service: UsersService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [UsersService],
}).compile();
service = module.get<UsersService>(UsersService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Nest 无法解析 UsersService 的依赖关系(?)。请确保索引 [0] 处的参数 UserRepository 在 RootTestModule 上下文中可用。
我发现 Stackoverflow 上的解决方案似乎已经过时,或者过于复杂。我知道问题源于 @InjectRepository 的使用。
解决办法是什么?我尝试下载其他人相当相似的项目,并得到相同的错误!均带有巢穴 8 和巢穴 7。
小智 9
Nest 无法解析依赖关系,因为您没有在测试模块中提供存储库。如果您正在进行单元测试,您可能想使用自定义提供程序来模拟存储库:
import { getRepositoryToken } from '@nestjs/typeorm';
describe('UsersService', () => {
let service: UsersService;
let repository: Repository<User>;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UsersService,
{
provide: getRepositoryToken(User),
useValue: {},
}
],
}).compile();
service = module.get<UsersService>(UsersService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
})
Run Code Online (Sandbox Code Playgroud)
您可以提供对象、类或工厂函数,更多详细信息请参阅文档: https: //docs.nestjs.com/fundamentals/custom-providers
然后在您的测试中,您可以这样模拟存储库的方法:
jest.spyOn(repository, 'find').mockResolvedValueOnce([])
Run Code Online (Sandbox Code Playgroud)
这不是唯一的模拟方法,但这是一种简单且标准的方法。
该文档非常清楚如何在使用时编写测试@nestjs/typeorm: https: //docs.nestjs.com/techniques/database#testing
这里还有很多示例:https://github.com/jmcdo29/testing-nestjs
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |