将TypeORM存储库注入NestJS服务以进行模拟数据测试

关于如何在本期中执行此操作的讨论很长时间。

我已经尝试了许多建议的解决方案,但运气不佳。

谁能提供一个具体示例,说明如何使用注入的存储库和模拟数据来测试服务?

回答:

假设我们有一个非常简单的服务,该服务通过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<{}>;

};

以上是 将TypeORM存储库注入NestJS服务以进行模拟数据测试 的全部内容, 来源链接: utcz.com/qa/399087.html

回到顶部