Ionic + Jasmine + Tslint - 类型上不存在属性“和”

Bru*_*ira 5 jasmine typescript ionic-framework tslint

大家。我正在这个样板文件上构建一个 Ionic 应用程序。现在,我正在为特定页面构建测试,我正在使用 jasmine 来模拟提供程序并设置方法的预期行为。这就是beforeEach()方法的样子:

    beforeEach(() => {
          mockLoadingController = jasmine.createSpyObj('ModalController', ['create', 'present', 'dismiss']);
          mockLoadingController.create.and.returnValue(mockLoadingController);

          mockModalController =  jasmine.createSpyObj('LoadingController', ['create', 'present',
            'onDidDismiss', 'dismiss']);
          mockModalController.create.and.returnValue(mockModalController);

          mockGeolocation =  jasmine.createSpyObj('Geolocation', ['getCurrentPosition']);

          mockGeolocation.getCurrentPosition.and.callFake(( ) => {
            return {then: ( ) => { }};
          });
          mockEvents = jasmine.createSpyObj('Events', ['publish', 'subscribe']);
          TestBed.configureTestingModule({
            schemas: [CUSTOM_ELEMENTS_SCHEMA],
            providers: [
              { provide: NavController, useValue: mockNavController },
              { provide: LoadingController, useValue: mockLoadingController },
              { provide: ModalController, useValue: mockModalController },
              { provide: Geolocation, useValue: mockGeolocation },
              { provide: Events, useValue: mockEvents },
              LocationPage,
            ],
          },
    ); } );
Run Code Online (Sandbox Code Playgroud)

当我为getCurrentPosition方法定义承诺返回时,问题就开始了:

    mockGeolocation.getCurrentPosition.and.callFake(( ) => {
            return {then: ( ) => { }};
    });
Run Code Online (Sandbox Code Playgroud)

我在测试时使用 tslint,它给了我以下错误

ERROR in [at-loader] ./src/pages/location/location.page.spec.ts:24:40 
    TS2339: Property 'and' does not exist on type '(options?: GeolocationOptions) => Promise<Geoposition>'.
Run Code Online (Sandbox Code Playgroud)

问题是:我怎样才能克服这个问题,让 TSLint 不再抱怨这段代码?

jcr*_*ada 9

实际上正确的类型是:

  let mockGeolocation: jasmine.SpyObj<Geolocation>;
  let mockEvents: jasmine.SpyObj<Events>;

Run Code Online (Sandbox Code Playgroud)


Bru*_*ira 7

问题解决了!我忘了详细说明我声明变量的方式:

describe('Location Page', () => {
  let mockLoadingController: any;
  let mockModalController: any;
  let mockGeolocation: Geolocation;
  let mockEvents: Events;
  beforeEach(() => {
  //rest of the code here
Run Code Online (Sandbox Code Playgroud)

如您所见,我为mockGeolocation变量定义了一个类型,并将其他类型设置为any。将所有变量设置为 any 与 jasmine 完美配合,并且不会在 tslint 中产生错误。

所以正确的代码是这样工作的:

describe('Location Page', () => {
  let mockLoadingController: any;
  let mockModalController: any;
  let mockGeolocation: any;
  let mockEvents: any;
  beforeEach(() => {
Run Code Online (Sandbox Code Playgroud)

  • 天啊!非常感谢!这正是我的问题。 (2认同)