测试:角度的spyOn Helper类

时间:2018-11-05 11:50:39

标签: javascript angular unit-testing jasmine

是否可以spyOn帮助类?在下面的代码中,StatefulPatternService.init()正在调用WebSocketHelper

我想窥探WebSocketHelper并模拟subscribeFn

 export class WebSocketHelper{
  
  private url: string;
  
  constructor(url){
    this.url = url;
    init();
  }
  
  init(){
    // init websocket & other login
  }
}


@Injectable({
  providedIn: 'root'
})
export class StatefulPatternService {
  constructor(){}
  
  private callback(_data){ }
  
  init(){
  
    let wsHelper = new WebSocketHelper('/subscribe/topic'); // <-- How to spyOn???
    wsHelper.subscribeFn = this.callback;
    // ...    
  }
}

如果不可能运行spyOn,那么如何重写它以便覆盖此测试?

1 个答案:

答案 0 :(得分:0)

您的挑战将是掌握“ wsHelper”以便进行监视。一个想法:您可以重构以使wHelper成为类作用域变量吗?然后,当您在测试套件中获得服务时,可以窥探它,例如:

service = TestBed.get(StatefulPatternService);
let spy = spyOn(service.wsHelper, 'subscribeFn');

更新

从评论到我的回答,看来您真正想要做的是验证是否使用正确的URL调用了构造函数。由于您将其保存在类变量中,因此无需监视构造函数,而只需测试保存的变量的值即可。正如我在评论中提到的那样,您需要做两件事:使wsHelper成为类级别的变量,并在WebSocketHelper类上添加一个返回私有变量“ url”的值的方法,以便对其进行测试。我已经设置了一个Stackblitz来演示我在这里谈论的内容:STACKBLITZ这是该Stackblitz的一个片段:

describe('MyService', () => {
    let myService: StatefulPatternService;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [/* any imports needed */],
            providers: [ StatefulPatternService ]
        });
        myService = TestBed.get(StatefulPatternService);
    });

    it('should be createable', () => {
        expect(myService).toBeTruthy();
    });
    it('should construct wsHelper properly', () => {
        myService.init();
        expect(myService.wsHelper.get_url()).toEqual('/subscribe/topic');
    })
});