Типы имеют отдельные объявления частного свойства макет модульного теста службы Angular 7

#angular #unit-testing #ionic-framework

#angular #модульное тестирование #ionic-framework

Вопрос:

Я пытаюсь создать макет сервиса, но я получаю сообщение об ошибке «Типы имеют отдельные объявления частного свойства», мне кажется, что объявление равно, а не отличается, но в нем говорится, что ошибки нет. Я выполняю этот тест в компоненте, в который внедрен сервис!!! Да, я хочу протестировать это здесь с помощью макетного теста.

Мой код для макета сервиса:

 class MockDataservice {   
result: any;
constructor(private http: HttpClient){
    sendCodeToServer() {
     return this.result;
     } 
}

describe('HomePage', () => 
...
{
 ...  
beforeEach(() => { 
...
    service = new MockDataservice(http);  
    component = new HomePage(platform, service, splash, statusbar, barcode, alert, http, loading, router);
  

Исходный сервис:

 export class DataStorageService {
    result: any;
      constructor(private http: HttpClient) {
      }

sendToServer(data) {
const headers = new HttpHeaders().set('Content-Type', 'application/json');
   return new Promise((resolve, reject) => {
   this.http.post(endpoindURL, data, { headers: headers })
        .toPromise().then((data) => {
          resolve(data);
        }).catch((err) => {
          console.log(err);
          reject(err);
        });
    });
  }
}
  

Использование сервиса в компоненте:

 export class HomePage {
barcodeScannerOptions: BarcodeScannerOptions;
    constructor(private platform: Platform, private **dataStorageService**: 
    DataStorageService,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar, private barcodeScanner: BarcodeScanner, public 
    alertController: AlertController,
    private http: HttpClient, private loadingController: LoadingController, 
    private router: Router) {

    this.initializeApp();

    this.barcodeScannerOptions = {
          showTorchButton: true,
          showFlipCameraButton: true
        };
      }

    function doesSomething(){
    this.dataStorageService.sendToServer(data).then((res) => {
    }
  

Я получаю ошибку здесь, в файле home.spec, в слове service

компонент = новая домашняя страница (платформа, сервис, заставка, строка состояния, штрих-код, оповещение, http, загрузка, маршрутизатор);

и ошибка

MockDataservice не может быть присвоен параметру типа //DataStorageService. Типы имеют отдельные объявления частной собственности http.ts

Комментарии:

1. можете ли вы правильно отформатировать свой код, пожалуйста?

2. @fjc теперь он правильно отформатирован, не могли бы вы присесть и взглянуть?

3. Есть ли причина, по которой вы вручную создаете экземпляр тестируемого модуля вместо того, чтобы разрешать Testbed это делать?

4. Ознакомьтесь с моим ответом ниже

Ответ №1:

Итак, вот исчерпывающий ответ на то, что происходит. Я сконструировал минимальный пример, который воспроизводит поведение: Сломанный пример на TypeScript Playground. На самом деле вы можете увидеть точно такое же сообщение об ошибке.

Что здесь происходит? Component Ожидает экземпляр фактического Service класса в своем конструкторе. MockService не является Service . Он просто по совпадению имеет те же параметры конструктора и те же имена методов. Компилятор не знает, что эти два устройства на самом деле совместимы (т. е. реализуют один и тот же интерфейс), и поэтому выдает ошибку.

Как нам это исправить? Работайте с реальной объектно-ориентированной абстракцией. Поскольку Service и MockService на самом деле взаимозаменяемы, нам нужно сообщить об этом компилятору. Как нам это сделать? Благодаря тому, что они реализуют один и тот же интерфейс.

Мы просто определим Service интерфейс. У нас будет ConcreteService , который содержит поведение по умолчанию и который реализует Service . У нас также будет наш, MockService который будет реализовывать то же самое Service , но с имитацией поведения: Рабочий пример на TypeScript playground.,

Комментарии:

1. большое вам спасибо за ответ на мой вопрос! это мне очень помогает