【问题标题】:Ionic async unit test with LoadingController使用 LoadingController 进行离子异步单元测试
【发布时间】:2022-01-27 13:28:41
【问题描述】:

我有一个 Ionic Angular 应用程序,我正在尝试为服务方法编写一个简单的单元测试。该方法显示一个 Loading 微调器,然后返回 true。

请看下面的代码:

Service.specs.ts

import {
  TestBed,
  ComponentFixture,
  inject,
  fakeAsync,
  tick,
  flushMicrotasks,
} from '@angular/core/testing'; import { GeneralmethodsService } from './generalmethods.service';
import { DomSanitizer } from '@angular/platform-browser';
import { ActivatedRoute, Router } from '@angular/router';
import { HTTP } from '@ionic-native/http/ngx';
import { Network } from '@ionic-native/network';
import { AlertController, LoadingController, ModalController, ToastController } from '@ionic/angular';
import { HandleNetworkService } from './handle-network.service';
import { TmmserviceService } from './tmmservice.service';
import { TranslateService } from '@ngx-translate/core';

describe('GeneralmethodsService xxx', () => {
  let modalController: ModalController;
  let tmmserviceServiceNatice: TmmserviceService;
  let loadingController: LoadingController;
  let router: Router;
  let toastController: ToastController;
  let translate: TranslateService;
  let Service: GeneralmethodsService;

  beforeEach(async () => {
    TestBed.configureTestingModule({
      providers: [
        GeneralmethodsService,
        {
          provide: LoadingController,
          useValue: {
            create: () => Promise.resolve(),
            dismiss: () => Promise.resolve()
          }
        }
      ]
    }).compileComponents();

    Service = new GeneralmethodsService(
      modalController,
      router,
      loadingController,
      tmmserviceServiceNatice,
      toastController,
      translate
    );
  });

  it('test testPist', fakeAsync(() => {
    return Service.testPist().then(async (data) => {
      expect(data).toBe(true);
      flushMicrotasks();
    });
  }));
});

下面可以看到服务中的方法实现 Service.ts

  async testPist(){
    let loading = await this.loadingController.create();
    await loading.present();
    loading.dismiss();
    return true;
  }

这是我得到的错误:

错误

错误:未捕获(承诺中):TypeError:无法读取未定义的属性(读取“创建”) TypeError: Cannot read properties of undefined (reading 'create')

谁能告诉我我做错了什么?

提前致谢

【问题讨论】:

    标签: unit-testing ionic-framework jasmine karma-runner


    【解决方案1】:

    是的,因为 loadingController 未定义。

    用 !! 关注 cmets

    TestBed.configureTestingModule({
          providers: [
            GeneralmethodsService,
            {
              provide: LoadingController,
              // !! You defined loading controller here in the TestBed module
              useValue: {
                create: () => Promise.resolve(),
                dismiss: () => Promise.resolve()
              }
            }
          ]
        }).compileComponents();
    
        // Service = new GeneralmethodsService(
          // modalController,
          // router,
          // !! at this point loadingController is undefined
          // loadingController,
          // tmmserviceServiceNatice,
          // toastController,
          // translate
        // );
        // !! comment out the above and get a handle on the service using the TestBed
         Service = TestBed.inject(GeneralMethodsService);
      });
    

    进行上述更改有望让您畅通无阻。由于您有一个 TestBed.configureTestingModule 并且已配置,因此我们可以使用它来获取被测服务的句柄。

    【讨论】:

    • 感谢您的回复。我做了你的建议现在它给了我以下错误``` NullInjectorError: R3InjectorError(DynamicTestModule)[GeneralmethodsService -> ModalController -> AngularDelegate -> AngularDelegate]: NullInjectorError: No provider for AngularDelegate! ```
    • 这是错的吗? !!您在 TestBed 模块中定义了加载控制器
    • 如果你能告诉我你的GeneralmethodsService的构造函数,我希望能帮上忙。我们需要模拟所有外部依赖项(注入构造函数的所有内容),类似于模拟LoadingController 的方式。你需要以同样的方式模拟ModalController
    • 这是我的构造函数 public loadingController: LoadingController, private router: Router, public toastController: ToastController, public modalController: ModalController, public tmmserviceServiceNatice: TmmserviceService, public translate: TranslateService 我已经设法解决了依赖问题.现在我得到错误:未捕获(承诺):cordova_not_available 我不知道为什么
    • 好的,太好了。我不确定科尔多瓦的问题。不幸的是,我在 Angular 方面的经验比 Ionic 多。
    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2014-03-28
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多