Angular 6: модульное тестирование асинхронного импорта файлов с помощью Karma - PullRequest
0 голосов
/ 28 февраля 2019

В основном я пытаюсь выполнить модульное тестирование своей асинхронной функции импорта файлов с помощью Karma, но почему-то не могу заставить ее работать.

Предположим, у меня есть следующая функция для импорта файла.Пользователь нажимает кнопку, которая открывает диалог с файлами операционной системы.Затем пользователь выбирает импортируемый файл и нажимает ОК.

  1. Считайте файл и сохраните его в 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;
   }

Чтобы проверить это, я попробовал это:

Модульный тест для проверки функции импорта

// 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() по какой-то причине не получается.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Любая помощь приветствуется.

Лучший, большой чувак

1 Ответ

0 голосов
/ 09 марта 2019

Этот тест никогда не будет успешным, потому что функция sendFileToBackend() никогда не возвращает true.Единственное место, где у вас есть оператор return true внутри функции, находится внутри подписки, которая будет возвращать только значение true для функции, в которой она находится, а не внешнюю sendFileToBackend().

Ваш редактор должен выбратьна этот факт для вас.Попробуйте определить возвращаемое значение для вашей функции следующим образом:

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

Ваш редактор должен жаловаться, что вы не возвращаете логическое значение из функции в кодированном виде.

...