Angular 6:使用Karma对异步文件导入进行单元测试

时间:2019-02-28 14:23:08

标签: angular unit-testing asynchronous karma-runner

基本上,我正在尝试使用Karma对异步文件导入功能进行单元测试,但是以某种方式我无法使其正常工作。

假设我具有以下导入文件的功能。用户单击一个按钮,从而打开操作系统文件对话框。然后,用户选择要导入的文件,然后按OK。

  
      
  1. 读取文件并将其存储在后端
  2.   
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;
   }

为了测试它,我尝试了这个:

  

单元测试以测试导入功能

// 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变为true,因为我传递了有效参数。但是expec(result).toBeTruthy()由于某种原因而失败。

如果需要更多信息,请告诉我。

感谢您的帮助。

最好, 大家伙

1 个答案:

答案 0 :(得分:1)

该测试将永远不会成功,因为函数sendFileToBackend()永远不会返回true。在函数内部唯一具有return true语句的位置是在订阅中,这仅是其所在函数的返回true,而不是外部sendFileToBackend()的返回。

您的编辑者应该为您了解这一事实。尝试为函数定义一个返回值,如下所示:

public sendFileToBackend(file: File): boolean {
/* rest of function */

您的编辑器应该抱怨您没有按照编码从函数中返回布尔值。