Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Angular 5服务的构造函数中监视/模拟方法调用?_Angular_Unit Testing_Typescript_Jasmine_Angular5 - Fatal编程技术网

如何在Angular 5服务的构造函数中监视/模拟方法调用?

如何在Angular 5服务的构造函数中监视/模拟方法调用?,angular,unit-testing,typescript,jasmine,angular5,Angular,Unit Testing,Typescript,Jasmine,Angular5,我有一个服务,它在构造函数中进行2次方法调用: constructor(private http: HttpClient) { this.apiURL = environment.apiURL; this.method(); this.method2().subscribe(); } 我正试图在测试台上测试这项服务。然而,在测试床.get(MyService)之前,我无法使用Jasmine的间谍进行间谍活动 以下是我的服务的测试台配置: let myServ

我有一个服务,它在构造函数中进行2次方法调用:

  constructor(private http: HttpClient) {
    this.apiURL = environment.apiURL;
    this.method();
    this.method2().subscribe();
  }
我正试图在测试台上测试这项服务。然而,在
测试床.get(MyService)
之前,我无法使用Jasmine的间谍进行间谍活动

以下是我的服务的测试台配置:

  let myService: MyService;
  let backend: HttpTestingController;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientModule,
        HttpClientTestingModule
      ],
      providers: [
        MyService
      ]
    }).compileComponents();

    myService = TestBed.get(MyService);
    backend = TestBed.get(HttpTestingController);
如何正确监视
method()
method2()
并为它们返回值。如果服务不是一个好的实践,那么将方法放入构造函数中是不是一个好的实践


method()
method2()
向服务器发送http调用,以“刷新”用户可能需要的数据,例如
在墙上张贴
。另一种方法是
Observable.timer
,它设置为令牌的年龄,一旦令牌过期,就自动注销应用程序

如果
method
method2
是原型方法,则可以在类原型上发现它们:

it('', () => {
  spyOn(MyService.prototype, 'method').and.callThrough();
  spyOn(MyService.prototype, 'method2').and.callThrough();
  const svc = TestBed.get(MyService);
  expect(svc['method']).toHaveBeenCalled();
  expect(svc['method2']).toHaveBeenCalled();
});
它始终取决于方法是否适合在构造函数中使用

如果方法返回订阅,则应将其保存为属性,因为稍后可能会取消订阅,例如在服务销毁时


考虑到
method
method2
是异步的,这可能是一种反模式。如果它们触发了预期在服务实例化时完成的请求,这将导致竞争条件,因为它们没有完成,并且服务也不会公开承诺或可观察项来跟踪请求的状态。正确的解决方案是不在构造函数中调用它们,而是在某个适合异步提供程序初始化的位置调用它们,即
APP\u初始值设定项
或路由解析器。

如果服务不是一个好的实践,是否将方法放入构造函数中?-这完全取决于这些方法是什么以及它们是如何工作的。它们不在上面的代码中。@estus,它们是根据jwt的过期时间,通过Observable.timer启动自动超时的方法调用。以及获取一些用户希望看到的数据,例如墙上的
帖子
,等等。