Модульный тест для службы с множеством зависимостей Angular - PullRequest
0 голосов
/ 25 февраля 2020

Я хотел бы знать, как протестировать следующий Сервис, который имеет две зависимости в конструкторе.

Я не знаю, как создать среду для тестирования, как реализовать MatDiaglog в тесте.

Должен ли я сделать поддельные запросы для проверки этой функции? В целом, что является хорошей практикой в ​​модульном тестировании, каков сценарий?

@Injectable()
export class FacultiesService {
  constructor(
    private apiService: ApiService,
    private dialog: MatDialog) { }


  openAddFacultyDialog(data = null) {
    const dialogRef = this.dialog.open(CreateEditComponent, {
      width: '400px',
      data
    });
    return dialogRef.afterClosed();
}

  createFaculty(faculty: Faculty) {
    return this.apiService.createEntity('Faculty', faculty);

  }
}

 @Injectable({
  providedIn: 'root'
})

export class ApiService {
  constructor(private http: HttpClient) { }

  createEntity(entity: string, payload): Observable<any> {
    return this.http.post(`${this.apiURI}${entity}/insertData`, payload);
  }

1 Ответ

1 голос
/ 25 февраля 2020

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

Если вы хотите проверить FacultiesService в вашем сценарии, то другие службы должны быть шпионскими или поддельными.

// you can pass data using this mockMatDialog
const mockMatDialog = {}
let apiServiceSpy = jasmine.createSpyObj('ApiService', ['createEntity']);
beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [{
        provide: ApiService,
        useValue: apiServiceSpy
      },
      {
        provide: MatDialog,
        useValue: mockMatDialog,
      },
    ]
  });
});

// If you want to get data from this spy observable use the following // syntax

apiServiceSpy.createEntity.and.returnValue(of({name: 'dummy data'}))

ОБНОВЛЕНИЕ НОВОГО ЗАПРОСА

Да, вы можете передавать данные, которые фактическая услуга вернула, например createEntity. Я имею в виду, что вы можете передать любые данные, необходимые для тестирования, которые соответствуют вашим критериям. Вы не должны проверять URL или метод http запроса, потому что они не являются частью этой службы. Но в сервисе вы можете проверить, вызывается ли createEntity() метод apiservice и с какими параметрами.

как

expect(apiServiceSpy.createEntity).toHaveBeenCalled();
OR
// you can get most recent calls to this method
expect(apiServiceSpy.createEntity.calls.mostRecent()).
OR
// you can check the arguments passed to createEntity method as well
expect(apiServiceSpy.createEntity.calls.allArgs())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...