NestJS TypeORM 模拟存储库的数据源

2023-12-05

我正在尝试模拟一个存储库。我不想进行实际的数据库调用。我(认为我)正在关注 NestJS 的文档以及某些 stackoverflow 项目。

但是,当我运行测试时,出现以下错误:

JwtStrategy › validate › throws an unauthorized exception as user cannot be found
Nest can't resolve dependencies of the UserEntityRepository (?). Please make sure that the argument DataSource at index [0] is available in the TypeOrmModule context.

Potential solutions:
- If DataSource is a provider, is it part of the current TypeOrmModule?
- If DataSource is exported from a separate @Module, is that module imported within TypeOrmModule?
  @Module({
    imports: [ /* the Module containing DataSource */ ]
  })

现在据我了解,似乎 UserEntityRepository 没有被正确模拟。因为它是用户服务类中的第一个(索引 [0])依赖项:

./user.service.ts

@Injectable()
export class UserService {
    constructor(
        @InjectRepository(UserEntity)
        private userRepository: Repository<UserEntity>
    ) {}

    async findOneBy({ username }): Promise<UserEntity> {
        return await this.userRepository.findOneBy({ username })
    }
}

./jwt.strategy.ts

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(
      private userService: UserService,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: process.env.JWT_SECRET || config.get('jwt.secret'),
    })
  }

  async validate(payload: JwtPayload) {
    const { username } = payload;
    const user = await this.userService.findOneBy({username});

    if (!user) {
      throw new UnauthorizedException();
    }

    return user;
  }
}

./jwt.strategy.spect.ts

const mockUserRepositoryFactory = jest.fn(() => ({
  findOneBy: jest.fn(entity => entity),
}));

describe('JwtStrategy', () => {
  let jwtStrategy: JwtStrategy;
  let userService;

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      imports: [UserModule],
      providers: [
        JwtStrategy,
        UserService,
        // shouldn't this correctly provide the datasource?
        {
          provide: getRepositoryToken(UserEntity),
          useFactory: mockUserRepositoryFactory,
        },

      ]
    }).compile();

    jwtStrategy = await module.get<JwtStrategy>(JwtStrategy);
    userService = await module.get<UserService>(UserService);
  });

  describe('validate', () => {
    it('validates and returns user based on JWT payload', async () => {
      const user = new UserEntity();
      user.username = 'TestUser';

      userService.findOneBy.mockResolvedValue(user);
      const result = await jwtStrategy.validate({ username: 'TestUser' });
      expect(userService.findOneBy).toHaveBeenCalledWith({ username: 'TestUser' });
      expect(result).toEqual(user);
    });

    it('throws an unauthorized exception as user cannot be found', async () => {
      userService.findOneBy.mockResolvedValue(null);
      expect(jwtStrategy.validate({ username: 'TestUser' })).rejects.toThrow(UnauthorizedException);
    });
  });
});

=====更新

在 Codesandbox 中创建了最小设置。

https://codesandbox.io/s/xenodochial-benz-kve4eq?file=/test/jwt.test.js

但不知何故,测试选项卡没有显示在沙箱中。


首先,您必须模拟数据源(如果您愿意,您可以创建一个单独的文件)

import { DataSource } from "typeorm";

// @ts-ignore
export const dataSourceMockFactory: () => MockType<DataSource> = jest.fn(() => ({
  <mock_function>: jest.fn(),
}));

export type MockType<T> = {
  [P in keyof T]?: jest.Mock<{}>;
};

然后创建一个测试文件

describe('---MSG---', () => {
...
  let dataSourceMock: MockType<DataSource>
...
  beforeAll(async () => {
    const module = await Test.createTestingModule({
      imports: [],
      controllers: [<CONTROLLERS>],
      providers: [ <PROVIDERS>
        { provide: DataSource, useFactory: dataSourceMockFactory }],
    }).compile()
...
    dataSourceMock = module.get(DataSource);
...
  })

  describe('---MSG---', () => {
    it('---MSG---', async () => {
      await <Call mock function>
      expect(dataSourceMock.<DataSource mocked function>).toBeCalled();
    });
  })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NestJS TypeORM 模拟存储库的数据源 的相关文章

随机推荐

  • 使用 XSLT 模板从一个 JAXB 对象转换为另一个 JAXB 对象

    有没有办法使用 XSLT 模板文件将 JAXB 生成的对象转换为另一个 JAXB 对象 这两个对象由两个不同的 JAXB 绑定生成 我知道我可以将对象编组为字符串 然后使用 XSLT 处理器将其转换为其他格式 之后将其解组到另一个 JAXB
  • Bazel 如何构建一个链接预构建外部库的简单应用程序

    Using Bazel2 2 我如何针对外部库进行构建 例如在我的情况下 我想针对 boost 进行构建 为 MS VC 2019 预构建 问题是这在 Bazel 中可能吗 鉴于 boost 库的本地路径是 c boost 1 72 0 其
  • 在 Delphi 7 中处理 CMYK jpeg 文件

    我正在尝试访问存储为 Jpeg 文件的文件 是否有一种简单的方法可以在不损失性能的情况下显示这些图像文件 您可以使用 TJPEGImage 实例加载 JPeg 文件 然后将其分配给 TBitmap 进行显示 您可以在单位 jpeg 中找到
  • 致命:远程错误:找不到存储库 octocat/myapp

    我是第一次使用 Git 刚刚分叉了一个开源项目 如下GitHub 的说明 我可以在本地计算机上克隆我的分叉 但在运行这些命令时出现错误 git remote add upstream git github com octocat myapp
  • 区分数据库中的最新数据

    我正在将数据存储在我的数据库中 存储的数据如下所示 id upload month created at 1 January 2017 01 30 13 22 39 2 Febuary 2017 01 30 13 23 42 3 Janua
  • 在 REPL 中使用对象时任务不可序列化

    因此 另一个问题促使我尝试以下操作 object Foo def f 1 sc parallelize List 1 map x gt val myF Foo f x myF 哪个有效 但以下无效 object Foo def f 1 de
  • ASP.Net MVC 路由捕获所有 *.aspx 请求

    This must之前曾被问过 但读完后here here here and here我无法推断相关部分以使其发挥作用 我正在将旧的 Web 表单站点改造成 MVC 并且想要捕获特定的传入 HTTP 请求 以便我可以发出RedirectPe
  • 按内部元素的数量对二维数组进行排序

    如何按二维数组内部元素的长度对其进行排序 内部元素的数量不相同 Example a 1 2 3 4 5 6 7 8 9 排序后 数组变为 gt 4 5 6 7 2 3 8 9 1 该解决方案有效 a 1 2 3 4 5 6 7 8 9 a
  • 表和存储过程的批量重命名

    我需要重命名所有表 存储过程 显然还有每个存储过程中引用旧表名称的代码 为什么这是最好的方法 我考虑过的一些方法 SP Rename 完成了一半的工作 然而 这不会改变 SP 本身内的代码 除了RedGates的Refactor之外 我在这
  • React Native:React 导航 StackNavigator 不起作用。收到错误:“未定义不是对象(评估'this.props.navigation.navigate')”

    我正在尝试使用 React Navigation 和 StackNavigator 在我的应用程序中导航 我有一个按钮onPress gt navigate DetailsScreen 我希望这能带我去DetailsScreen 但我收到以
  • iPhone 应用程序升级时强制重置 NSUserDefault

    每当用户更新我的应用程序时 我想强制重置为 NSUserDefault 为什么我需要这个 因为每次更新都包含一些关于用户的新信息 由于 NSUserDefault 中已经存在一些信息 令牌 我的应用程序不会调用我的网络服务 因此我没有新的用
  • Python子进程和用户交互

    我正在 Python 2 6 中开发 GUI 前端 通常它相当简单 你使用subprocess call or subprocess Popen 发出命令并等待其完成或对错误做出反应 如果您的程序停止并等待用户交互 您会怎么做 例如 程序可
  • 升级 python 图像库 (PIL) 时,它告诉我“JPEG 支持不可用”

    使用ubuntu 13 10 python 2 7 5 gt gt gt import imaging Image gt gt gt from PIL import Image ImageDraw ImageFilter ImageFont
  • 从http内部函数返回数据

    我在用着this and this参考 从函数内的 http 请求返回数据 function getdetails id var datafordetails data1 item1 item2 data2 item3 ID id var
  • 将项目视为邮件项目

    我正在 Outlook 2016 中创建一个 VBA 应用程序 它分析传入的电子邮件并获取其主题行来搜索重复 或接近重复 的主题行 我使用 for each 循环来浏览项目列表 收件箱中的电子邮件 并分析每个项目的标准 一旦需要回复 传入的
  • R strptime 来自周数的星期一日期很奇怪

    我在这里犯了一个小错误 但无法集中精力找出问题所在 我需要获取随机日期的星期一的日期 似乎我得到了完全不同的东西 mydate lt date 2013 11 05 format mydate A this is Tuesday right
  • 流畅和查询表达式——其中一种比另一种有什么好处吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 LINQ 是自泛型以来对 NET 最伟大的改进之一 它为我节省了大量的时间和代码行 然而 对我来说 流畅的语法似乎比查询表达式语法更自然 var title entries Where e
  • 强制 MS Access 检索所有列表框行并释放锁定

    我有一个列表框 其中 RowSource 绑定到附加的 SQL Server 表 如果表很大 Access 不会加载完整的结果集 而是创建服务器端游标并在列表框向下滚动时 按需 加载数据 这是一个很好的功能 因为它允许列表框和组合框快速显示
  • jquery validate:为错误消息添加淡入/淡出效果

    我想为 jquery 验证上显示的错误消息添加淡入 淡出效果 有什么方法可以做到这一点 我可以在它们上使用 div 并单独处理它们吗 插件有这个效果吗 我使用此代码来放置错误消息 我需要它来正确放置 commentForm2 validat
  • NestJS TypeORM 模拟存储库的数据源

    我正在尝试模拟一个存储库 我不想进行实际的数据库调用 我 认为我 正在关注 NestJS 的文档以及某些 stackoverflow 项目 但是 当我运行测试时 出现以下错误 JwtStrategy validate throws an u