Angular Jasmin ObjectSpy不是函数

时间:2019-05-18 10:28:44

标签: angular jasmine mocking

无论何时在任何测试中调用它,我都试图监视服务,因此请创建一个模拟程序:

import { SpyObject } from './spyobject';
import { TranslateService } from '@ngx-translate/core';

export class MockTranslateService extends SpyObject {

  constructor() {
    super(TranslateService);
    this.spy('instant').andReturn('');
  }
}

我这样提供:

    {
      provide: TranslateService,
      useValue: MockTranslateService,
    },

我的组件使用this.translateService.instant并获得:TypeError: this.translateService.instant is not a function

另一方面,当我在组件中登录translateService时,会得到:

class MockTranslateService extends spyobject_1.SpyObject {
          constructor() {
              super(core_1.TranslateService);
              this.spy('instant').andReturn(this);
          }
      }

知道间谍为什么不起作用吗?预先感谢。

2 个答案:

答案 0 :(得分:0)

要使this.spy('instant')工作,您需要一个监视功能。这将起作用:

export class MockTranslateService extends SpyObject {
  constructor() {
    super(TranslateService);
    this.spy('instant').andReturn('');
  }

  public instant() { }
}

由于已经定义了instant函数,因此可以添加间谍。


编辑,这可能会更容易。在beforeEach块中,执行以下操作:

beforeEach(() => {
  spyOn(TranslateService.prototype, 'instant');
});

这会将间谍直接放置在原型上,并在每次测试后清理干净。

答案 1 :(得分:0)

问题出在我在测试配置中提供模拟的方式上,应该是这样的:

    {
      provide: TranslateService,
      useValue: new MockTranslateService(),
    },

我不完全理解为什么,有时其他语法起作用,有时不起作用,我认为这与Typescript处理类型有关。