假设我们有一个非常简单的服务,该服务通过id查找用户实体:
export class UserService {
constructor(@InjectRepository(UserEntity) private userRepository: Repository<UserEntity>) {
}
async findUser(userId: string): Promise<UserEntity> {
return this.userRepository.findOne(userId);
}
}
然后,您可以UserRepository
使用以下模拟工厂模拟(根据需要添加更多方法):
// @ts-ignore
export const repositoryMockFactory: () => MockType<Repository<any>> = jest.fn(() => ({
findOne: jest.fn(entity => entity),
// ...
}));
使用工厂可确保为每个测试使用新的模拟。
describe('UserService', () => {
let service: UserService;
let repositoryMock: MockType<Repository<UserEntity>>;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UserService,
// Provide your mock instead of the actual repository
{ provide: getRepositoryToken(UserEntity), useFactory: repositoryMockFactory },
],
}).compile();
service = module.get<UserService>(UserService);
repositoryMock = module.get(getRepositoryToken(UserEntity));
});
it('should find a user', async () => {
const user = {name: 'Alni', id: '123'};
// Now you can control the return value of your mock's methods
repositoryMock.findOne.mockReturnValue(user);
expect(service.findUser(user.id)).toEqual(user);
// And make assertions on how often and with what params your mock's methods are called
expect(repositoryMock.findOne).toHaveBeenCalledWith(user.id);
});
});
为了确保类型安全和舒适,您可以在模拟中使用以下类型(远非完美,当笑话本身在即将发布的主要版本中开始使用Typescript时,可能会有更好的解决方案):
export type MockType<T> = {
[P in keyof T]: jest.Mock<{}>;
};
假设我们有两个服务,A和B。服务A有一个函数执行以下操作: 验证数据 现在,让我们假设以下步骤之一,步骤3或4失败。由于服务B对数据库进行了更改,这些更改仍然存在。 在这种情况下,有没有办法回滚数据库?我曾考虑过数据库事务,但在nest js中找不到任何方法来实现这一点,尽管TypeOrm支持它,但nest看起来并不自然。如果不是的话,我现在被服务B所做的更改“卡住”了,但是如果没有服务B所做的更
问题内容: 我写了一个AngularJS服务,我想对其进行单元测试。 我的app.js文件已注册: 我可以测试DI是否像这样工作: 这证明了可以通过DI框架创建服务,但是接下来我要对服务进行单元测试,这意味着要模拟注入的对象。 我该怎么做呢? 我试过将我的模拟对象放在模块中,例如 并将服务定义重写为: 但是后者似乎停止了DI所创建的所有服务。 有人知道我可以如何为单元测试模拟注入的服务吗? 谢谢
现在,当调用“/comments/1”时,我得到了404个错误,所以数据rest没有公开我的存储库。主要问题是“如何模拟存储库方法从数据库中获取数据?” 我的测试类: 据我所知,使用MockBean注释我替换了当前的存储库bean并且它不会被数据rest公开,我们有没有办法将数据预填充到db或存储库方法的模拟调用?
问题内容: 我需要将两个对象注入。其中一个是的实例,我得到这样的信息: 那么如何在我的services.yml中声明呢?这是服务: 问题答案: 我找到了此链接,这对我有用:
我正在用Symfony制作简单的应用程序。我在这里配置了服务 我的服务使用存储库(例如,评论服务使用评论存储库),这里是的构造函数 性质 构造函数: 当我试图运行我的应用程序我得到这个错误 PHP致命错误:未捕获Symfony\Component\DependencyInjection\Exception\AutowiringFailedException:无法自动连线服务“AppBundle\R
问题内容: 我有一个和一个。 我想用的。 当我通过注射添加时: 我得到这个嵌套错误: [嵌套] 11592-2018-8-13 11:42:17 [ExceptionHandler] Nest无法解析PlayersService(+,?)的依赖项。请确保索引[1]的参数在当前上下文中可用。 这两个模块均导入。两种服务都在其模块中单独工作。 问题答案: 你要 导出 的是它提供的模块: 然后将导出 模