当我尝试对使用组件类中的服务的任何函数进行单元测试时,我不断遇到此错误。这是我的功能的一部分。
loadUser() {
this.httpService.getData(AppConfig.URL_UserById + "?UserID=" + this.userId)
.catch((error: Response | any) => {
this.showAlertWindow(this.exceptionMessage);
console.error(error.message || error);
return Observable.throw(error.message || error);
})
Run Code Online (Sandbox Code Playgroud)
此部分从 url 检索数据并在出现问题时抛出错误。getData 是一个发出 get 请求的服务。我只是想测试 showAlertWindow 方法是否被调用。现在我很确定我的测试代码是正确的,但我必须缺少一些东西才能收到此错误。我猜茉莉花不知道该做什么,this.httpService.getData(...)谢谢。
测试:
fit('should have getUsers() call showAlertWindow', () => {
let window = spyOn(userComponent, 'showAlertWindow');
userComponent.loadUser(); //Fails here
expect(window).toHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)
})
完整错误:
Error: Cannot call Promise.then from within a sync test.
Error: Cannot call Promise.then from within a sync test.
at SyncTestZoneSpec.webpackJsonp../node_modules/zone.js/dist/zone-testing.js.SyncTestZoneSpec.onScheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:365:1)
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:401:1)
at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:232:1) …Run Code Online (Sandbox Code Playgroud) 对于我的单元测试,我确保我的组件调用正确的方法,然后在调用时表现得适当。我在这些测试中遇到的唯一麻烦是错误。我试图使我的服务失败,以便在警报窗口中显示异常消息。我正在寻找有关如何使我的服务失败而不导致实际测试失败的见解。可以说我有一个与此类似的函数:
exceptionMessage: string = 'error, please contact administrator'
getInfo() {
this.myService.getData('url')
.catch((error: Response | any) => {
this.displayAlert(this.exceptionMessage);
console.error(error.message || error);
return Observable.throw(error.message || error);
});
};
Run Code Online (Sandbox Code Playgroud)
测试:
fit('should call displayAlert', () => {
let window = spyOn(userComponent, 'displayAlert');
spyOn(myService, 'getData').and.returnValue(Observable.of('url')//need to fail here
userComponent.ngOnInit();
userComponent.getInfo();
expect(window).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
运行测试时,我的代码期望调用间谍窗口。但由于我的服务没有失败,我无法访问代码中的 displayAlert 函数。现在,我能够成功测试我的服务是否正确处理错误,但它们捕获可观察到的内容,并且不会像我的组件方法那样显示警报窗口。我尝试像我的服务一样实施测试,但没有成功。我的目标是进行单元测试,这会导致我的服务失败。从那里我需要测试当我的组件遇到错误时,会显示错误消息。我需要服务失败才能获取代码,this.displayAlert谢谢!如果有人可以指导我找到适当的文档或提供见解,那就太好了。我在这方面找不到太多信息。
编辑:更新测试:
fit('should have getUsers() call showAlertWindow', () => {
let window = spyOn(userComponent, 'showAlertWindow');
spyOn(userComponent, 'loadUser').and.throwError('Error');
expect(() => {
userComponent.loadUser()}).toThrowError('Error');
userComponent.loadUser();
expect(window).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud) 我有一个 e2e 测试,它在我的应用程序的表单中填写数据。我想让代码更高效,并想知道它是否值得。基本上,我目前的代码将键发送到所有必填字段,然后单击保存按钮。从那里我检查数据是否正确显示以及是否显示成功消息。保存表单后的测试不是我需要提高效率的。这是填写表格的过程。所以我很好奇是否有人可以提供任何有关这样做的更实用方法的见解。我有点困惑,因为量角器使用承诺,所以为我的表单做一个循环不会真正起作用,因为元素不可见。此外,我有一个电子邮件验证和下拉菜单,因此循环执行并不能很好地工作,因为有些字段需要特定格式。我正在考虑创建一个填写整个表单的函数,然后在我的测试中调用该函数,以便我的测试更有效率。我只是不确定这样做是否值得。任何建议都会很棒。我应该保留代码原样吗?这是我填写表单的代码示例。谢谢!
page.getNameInput().sendKeys('test');
browser.sleep(1000);
page.getLastNameField().sendKeys('testLast');
browser.sleep(1000);
page.getEmailField().sendKeys('test@test')
//these are drop down menus
page.getProgramField().sendKeys(Key.RETURN);
page.getProgramField().sendKeys(Key.RETURN);
//2nd drop down
page.getFileField().sendKeys(Key.RETURN);
page.getFileField().sendKeys(Key.RETURN);
})
Run Code Online (Sandbox Code Playgroud)