简体   繁体   English

使用DarkSkyApi调用进行Angular 2服务单元测试

[英]Angular 2 Services Unit Testing with DarkSkyApi call

I hope you can help. 希望您能提供帮助。 I search in the whole internet for answer to my questions. 我在整个互联网上搜索我的问题的答案。 I new in programming with Angular 2 and all answers i find are to crypticle to me. 我刚开始使用Angular 2编程,我发现的所有答案都是对我的密码。

so thats my question. 这就是我的问题。 I will test a service in angular 2 with karma. 我将使用业力测试角度2中的服务。 And have the DarkskyApi in Use at the Service: 并在服务中使用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');
  }
}

and this is the test to the service: 这是对服务的测试:

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();
  }));
});

When i run the test i become follow error: 当我运行测试时,我变得遵循错误:

TypeError: dark_sky_api_1.default is not a constructor TypeError:dark_sky_api_1.default不是构造函数

I hope so you can help. 希望能为您提供帮助。

Thanks, Steffen 谢谢,史蒂芬

The reason is that you create a new instance instead of having an DI. 原因是您创建了一个新实例而不是一个DI。 You could propably add DarkSkiApi via Factory. 您可以通过Factory适当添加DarkSkiApi。 This is just blind coded. 这只是盲编码。

in app.module.ts 在app.module.ts中

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

then you have a factory 那你有一家工厂

import DarkSkyApi from 'dark-sky-api';

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

in your service it will look like this: 在您的服务中它将如下所示:

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

and then you can easily mock the API in your test 然后您可以轻松地在测试中模拟API

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

This is really just a basic Idea how to rewrite your code to be better testable 这实际上只是一个基本的想法,即如何重写代码以更好地进行测试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM