【问题标题】:How to unit test function called in service's constructor?如何对服务构造函数中调用的函数进行单元测试?
【发布时间】:2020-09-09 20:21:57
【问题描述】:

如何在服务的规范文件中测试构造函数中是否调用了函数?例如:

@Injectable({
    providedIn: 'root'
})
export class myService {
  

    constructor() {
       this.myFunction();
    }

    myFunction(){}
}

那么我怎样才能测试我的函数是否被调用了呢?

beforeEach(() => {
TestBed.configureTestingModule({});
    service = TestBed.get(myService);

在 testbed.get 之前我无法窥探该服务,我尝试了:

it('should demonstrate myFunction called in constructor', () => {
  const spy = spyOn (myService, 'myFunction');
  const serv = new myService();

  expect(spy).toHaveBeenCalled();
});

但这并不能说明没有调用 spy!

任何帮助将不胜感激。

【问题讨论】:

  • 只是想知道,您要监视的方法是在您要测试的服务中定义的吗?如果是这种情况,您应该对函数内的任何调用进行存根。在要测试的东西中存根方法通常不是一个好主意,在这种特殊情况下,这不仅是一个坏主意,而且很可能不起作用。
  • 感谢您的帮助,但不确定您的意思,但我在 slideshowp2 的帮助下完成了工作,

标签: angular unit-testing service jasmine karma-runner


【解决方案1】:

使用spyOn(obj, methodName) → {Spy} 监视myFunction 上的MyService.prototype

例如

service.ts:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class MyService {
  constructor() {
    this.myFunction();
  }

  myFunction() {}
}

service.test.ts:

import { MyService } from './service';

describe('63819030', () => {
  it('should pass', () => {
    const myFunctionSpy = spyOn(MyService.prototype, 'myFunction').and.stub();
    const service = new MyService();
    expect(myFunctionSpy).toHaveBeenCalledTimes(1);
  });
});

【讨论】:

  • 谢谢一百万,在我的情况下它不需要 and.stub(),关键是原型,另外,我发现你需要监视构造函数()中的所有其他方法,至少在我的实际情况下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2018-09-14
  • 2010-09-26
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多