Angular 2 服务单元测试与 DarkSkyApi 调用

Angular 2 Services Unit Testing with DarkSkyApi call

希望对你有所帮助。我在整个互联网上搜索我的问题的答案。我刚开始使用 Angular 2 编程,我找到的所有答案对我来说都是神秘的。

这就是我的问题。我将在 angular 2 中使用 karma 测试一项服务。并在服务中使用 DarkskyApi:

//imports
import DarkSkyApi from 'dark-sky-api';  

@Injectable()
export class WetterService {

  /***
   * Konstruktor
   */
  constructor() {
    this.skyApi = this.InitDarkSky();
  }

  /**
   * Die Verbindung zur API Darksky initalialisiern
   */
  private InitDarkSky(): IDarkSkyApi {
    const darksky: IDarkSkyApi = new DarkSkyApi(this.ApiKey);

    // Ansteuern der Api
    return darksky
      .units('si')
      .language('de');
  }
}

这是对服务的测试:

import { TestBed, inject } from '@angular/core/testing';

import { WetterService } from './wetter.service';
import {HttpClientModule} from '@angular/common/http';
import DarkSkyApi from 'dark-sky-api';

describe('WetterService', () => {
  let darkSkyApi: DarkSkyApi;

  beforeEach(() => {
    darkSkyApi = new DarkSkyApi();
    TestBed.configureTestingModule({
      providers: [
        WetterService
      ],
      imports: [HttpClientModule]
    });
  });

  it('should be created', inject([WetterService], (service: WetterService) => {
    expect(service).toBeTruthy();
  }));
});

当我 运行 测试时,我会跟随错误:

TypeError: dark_sky_api_1.default 不是构造函数

希望对您有所帮助。

谢谢, 斯蒂芬

原因是你创建了一个新的实例,而不是有一个 DI。您可以通过 Factory 添加 DarkSkiApi。这只是盲码。

在app.module.ts

providers: [{
  provide: DarkSkyApi,
  useFactory: DarkSkyApiFactory
}]

那你就有了工厂

import DarkSkyApi from 'dark-sky-api';

export function DarkSkyApiFactory(): JwtHelper {
 return new DarkSkyApi('API_KEY');
}

在您的服务中它看起来像这样:

  export class WetterService {
     constructor(private darkSkyApi: DarkSkyApi) {
       this.darksky
           .units('si')
           .language('de');
     } 
  }

然后您可以轻松地在测试中模拟 API

    wetterService = new WetterService(fakeApi as DarkSkyApi);
    class fakeApi = {
     units(unit: string) {}
     language(language: string) {}
    };

这实际上只是一个基本的想法,如何重写代码以更好地测试