【问题标题】:Angular Unit Tests: "is not a function" when using provide useValueAngular 单元测试:使用提供 useValue 时“不是函数”
【发布时间】:2018-03-18 11:26:30
【问题描述】:

我有以下代码模拟来自服务的数据:

providers: [
        { provide: AdminService, useValue: { avcData: { runMode: 'NORMAL' } } }
      ]

问题是,当我使用 useValue 模拟数据时,似乎测试无法初始化服务方法,并且在我的单元测试中收到以下错误:

TypeError: _this.adminService.toLocalDate is not a function

虽然方法存在。

我的测试是这样的:

it('should be created', () => {
    expect(component).toBeTruthy();
  });

有什么方法可以在不重写/复制方法代码的情况下修复单元测试?

【问题讨论】:

  • 虽然该方法存在 - 它不存在,您只是模拟了该服务并且没有提供 toLocalDate 方法。
  • @estus 我还需要重写/复制单元测试中的方法吗?
  • 如果被测试的方法使用它们,比是,它们应该是茉莉间谍。
  • @estus 你能举个例子吗?目前我只是想测试该组件是否已创建,该方法是在 init 上调用的。如果我必须复制该方法,我无法理解您的评论。
  • useValue: { toLocalDate: jasmine.createSpy('toLocalDate'), ... }.

标签: angular unit-testing karma-jasmine


【解决方案1】:

使用“useValue”选项,您可以为对象创建一个新签名。在您的代码中,AdminService 是以下结构的对象:

   { avcData: { runMode: 'NORMAL' } } 

由于这没有toLocalDate 方法(或您的代码中使用的任何其他方法),它会给出错误。

如果您想利用实际 AdminService 类中存在的方法,那么您可以使用 useClass: AdminService 而不是 useValue: {}。在这种情况下,您需要在需要存根的函数上使用 spy 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 2019-05-15
    • 1970-01-01
    • 2015-03-04
    • 2021-05-08
    • 2020-10-27
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多