Angular 6:使用 Karma 对异步文件导入进行单元测试
Angular 6: Unit test an async file import with Karma
基本上,我正在尝试使用 Karma 对我的异步文件导入功能进行单元测试,但不知何故我无法让它工作。
假设我有以下导入文件的功能。用户单击一个按钮,从而打开操作系统文件对话框。然后用户选择要导入的文件并按下确定。
- Read a file and store it in the Backend
public handleTheProcess(event){
// set this.file with a selected file
this.file = <File>event.type.target.files[0];
this.sendFileToBackend(this.file);
}
public sendFileToBackend(file: File){
if(file){
// create a FormData obj since the file comes from a MultiPart file
const formData = new FormData();
formData.append( // append the file...);
// send file to the backend via a POST reqest
this.http.post(...)
.subscribe( event => { // Do some status checks..
return true;
}, (error: HttpErrorResponse) => {
return false;
});
} else {
// something unexpected happend
return false;
}
为了测试它,我尝试了这个:
Unit test to test the import function
// basic configureTestSuite configs generated by Angular itself
// ...
//...
describe("Request should return true because we pass a valid file", () => {
fit("return false", fakeAsync(() => {
event = {};
event.target = {};
event.target.files = [];
event.target.files.push( new File(["Excel file content"], "Mock.xlsx", { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }));
const formData = new FormData();
formData.append("file", event.target.files[0], event.target.files[0].name);
// import the mocked file
const result = component.sendFileToBackend(event.target.files[0]);
httpMock.expectOne(...).flush(formData, {status: 200, statusText: "Okayo"});
tick();
expect(result).toBeTruthy();
}));
}
我错过了什么?
AFAIK,result
变为真,因为我传递了一个有效参数。但是 expec(result).toBeTruthy()
由于某种原因失败了。
如果您需要更多信息,请告诉我。
感谢任何帮助。
最好的,
大哥
此测试永远不会成功,因为函数 sendFileToBackend()
永远不会 return 为真。函数中唯一有 return true
语句的地方是在订阅中,对于它所在的函数,它只是 return 为真,而不是外部 sendFileToBackend()
.
您的编辑应该为您了解这一事实。尝试为您的函数定义一个 return 值,如下所示:
public sendFileToBackend(file: File): boolean {
/* rest of function */
您的编辑应该抱怨您没有return从编码的函数中输入布尔值。
基本上,我正在尝试使用 Karma 对我的异步文件导入功能进行单元测试,但不知何故我无法让它工作。
假设我有以下导入文件的功能。用户单击一个按钮,从而打开操作系统文件对话框。然后用户选择要导入的文件并按下确定。
- Read a file and store it in the Backend
public handleTheProcess(event){
// set this.file with a selected file
this.file = <File>event.type.target.files[0];
this.sendFileToBackend(this.file);
}
public sendFileToBackend(file: File){
if(file){
// create a FormData obj since the file comes from a MultiPart file
const formData = new FormData();
formData.append( // append the file...);
// send file to the backend via a POST reqest
this.http.post(...)
.subscribe( event => { // Do some status checks..
return true;
}, (error: HttpErrorResponse) => {
return false;
});
} else {
// something unexpected happend
return false;
}
为了测试它,我尝试了这个:
Unit test to test the import function
// basic configureTestSuite configs generated by Angular itself
// ...
//...
describe("Request should return true because we pass a valid file", () => {
fit("return false", fakeAsync(() => {
event = {};
event.target = {};
event.target.files = [];
event.target.files.push( new File(["Excel file content"], "Mock.xlsx", { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }));
const formData = new FormData();
formData.append("file", event.target.files[0], event.target.files[0].name);
// import the mocked file
const result = component.sendFileToBackend(event.target.files[0]);
httpMock.expectOne(...).flush(formData, {status: 200, statusText: "Okayo"});
tick();
expect(result).toBeTruthy();
}));
}
我错过了什么?
AFAIK,result
变为真,因为我传递了一个有效参数。但是 expec(result).toBeTruthy()
由于某种原因失败了。
如果您需要更多信息,请告诉我。
感谢任何帮助。
最好的, 大哥
此测试永远不会成功,因为函数 sendFileToBackend()
永远不会 return 为真。函数中唯一有 return true
语句的地方是在订阅中,对于它所在的函数,它只是 return 为真,而不是外部 sendFileToBackend()
.
您的编辑应该为您了解这一事实。尝试为您的函数定义一个 return 值,如下所示:
public sendFileToBackend(file: File): boolean {
/* rest of function */
您的编辑应该抱怨您没有return从编码的函数中输入布尔值。