gpt4 book ai didi

Angular2 - 测试调用内部http服务的函数

转载 作者:太空狗 更新时间:2023-10-29 18:08:15 25 4
gpt4 key购买 nike

我目前正在尝试测试调用 http 请求服务然后在订阅部分执行某些操作(调用函数并设置变量)的函数。到目前为止,我的方法是只调用该函数,我认为请求服务将被自动调用,因此订阅部分将被执行。但是,我觉得这不是这样做的方法,因为它不起作用。

我要测试的功能:

  public trainBot() {
this.isTraining = true;
this.requestsService.trainModel(this.botId, false)
.subscribe(response => {
this.trainingStatus = this.trainingStatusMapping[response['status']];
this.pollTrainingStatus();
});
}

到目前为止我的测试(不起作用)。

it('should poll the training status', () => {
spyOn(component, 'pollTrainingStatus').and.callThrough();
component.trainBot();
fixture.detectChanges();
expect(component.pollTrainingStatus).toHaveBeenCalled();
});

那么,谁能告诉我如何在 .subscribe(... 部分中测试该部分?

更新:

正如有人建议的那样,我在测试中添加了 returnValue 和 async。他们仍然没有工作,但现在看起来像这样:

it('should poll the training status', fakeAsync(() => {
component.trainBot();
spyOn(service, 'trainModel').and.returnValue(Observable.of({'status': 'training'}));
spyOn(component, 'pollTrainingStatus').and.callThrough();
fixture.detectChanges();
tick(1);
expect(service.trainModel).toHaveBeenCalled();
expect(component.pollTrainingStatus).toHaveBeenCalled();
}));

错误是一样的

最佳答案

首先,您需要在运行 trainBot() 方法之前创建您的 Spies。那应该可以修复您的测试。

it('should poll the training status', () => {
spyOn(service, 'trainModel').and.returnValue(Observable.of({'status': 'training'}));
spyOn(component, 'pollTrainingStatus');

component.trainBot();

expect(service.trainModel).toHaveBeenCalled();
expect(component.pollTrainingStatus).toHaveBeenCalled();
}));

但是,让我们谈谈您的测试策略。

老实说,您是在测试一个组件,而不是服务,所以您不应该让服务方法调用通过。

spyOn(service, 'trainModel').and.returnValue(Observable.of({'status': 'training'}));

此外,单元测试应该测试尽可能小的东西。您实际上是在这里测试回调,并且回调可能应该是命名方法而不是匿名箭头函数。然后您可以在其他测试中测试和验证回调的功能。

public trainBot() {
this.isTraining = true;
this.requestsService.trainModel(this.botId, false)
.subscribe(response => this.onTrainbotSuccess(response));
}

public onTrainbotSuccess(response) {
this.trainingStatus = this.trainingStatusMapping[response['status']];
this.pollTrainingStatus();
}

这个测试中,您可以测试响应方法是否被调用

it('should call service.trainModel', () => {
spyOn(service, 'trainModel').and.returnValue(Observable.of({'status': 'training'}));

component.trainBot();

expect(service.trainModel).toHaveBeenCalled();
});

it('should send success responses to onTrainbotSuccess()', () => {
spyOn(component, 'onTrainbotSuccess');
spyOn(service, 'trainModel').and.returnValue(Observable.of({'status': 'training'}));

component.trainBot();

expect(component.onTrainbotSuccess).toHaveBeenCalled();
});

现在我们可以针对成功回调的具体作用编写测试。

it('should poll the training status', () => {
spyOn(component, 'pollTrainingStatus');

component.onTrainbotSuccess({'status': 'training'});

expect(component.pollTrainingStatus).toHaveBeenCalled();
});

关于Angular2 - 测试调用内部http服务的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45469219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com