Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DarkSkyApi调用进行Angular 2服务单元测试_Angular_Unit Testing_Typescript_Karma Jasmine_Angular2 Services - Fatal编程技术网

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

使用DarkSkyApi调用进行Angular 2服务单元测试,angular,unit-testing,typescript,karma-jasmine,angular2-services,Angular,Unit Testing,Typescript,Karma Jasmine,Angular2 Services,我希望你能帮忙。我在整个互联网上搜索我的问题的答案。我是Angular 2编程新手,我找到的所有答案都是crypticle 这就是我的问题。我将用因果报应测试angular 2中的服务。并在服务中使用DarkskyApi: //imports import DarkSkyApi from 'dark-sky-api'; @Injectable() export class WetterService { /*** * Konstruktor */ constructo

我希望你能帮忙。我在整个互联网上搜索我的问题的答案。我是Angular 2编程新手,我找到的所有答案都是crypticle

这就是我的问题。我将用因果报应测试angular 2中的服务。并在服务中使用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\u sky\u api\u 1.default不是构造函数

我希望你能帮忙

谢谢,
Steffen

原因是您创建了一个新实例,而不是使用DI。您可以通过工厂添加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) {}
    };

这实际上只是一个基本的想法,如何重写代码以使其更好地可测试,原因是您创建了一个新实例,而不是使用DI。您可以通过工厂添加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) {}
    };

这实际上只是一个基本的想法,如何将代码重写为更好的可测试性:你确定你正确调用了DarkSkyApi构造函数吗?什么是
DarkSkyApi=new DarkSkyApi()在测试中应该做什么?您实际上没有使用该实例,并且它与您在生产代码中创建它的方式不匹配。错误是从哪里来的?嘿,对不起,我看不到你的答案。是的,错误来自初始化。我已经更改了密码。这是我的,这是,这是。测试时,我出现错误“无法解析WetterService:(?)”我的git到项目:您确定正确调用了DarkSkyApi构造函数。什么是
DarkSkyApi=new DarkSkyApi()在测试中应该做什么?您实际上没有使用该实例,并且它与您在生产代码中创建它的方式不匹配。错误是从哪里来的?嘿,对不起,我看不到你的答案。是的,错误来自初始化。我已经更改了密码。这是我的,这是,这是。在测试中,我出现了错误“无法解析WetterService的所有参数:(?)”谢谢Carsten的快速回答,我已经重构了代码。而且这个应用程序还能工作!但我不知道如何更改我的服务测试:我已经将更改推到了git中。很高兴听到你的应用程序运行正常,但我不知道你想更改什么。对于服务规范,我通常避免使用测试床。看,是的,我也使用测试床。你可以在我上面的链接中看到。对不起,我是新来的。我需要帮助来初始化我的服务。在这种情况下,我会向提供者添加类似{use:DarkSkyApi,useClass:FakeDarkSkyApi}的内容-然后DI将被解决,它将使用你的假类而不是真类Hey carsten,感谢你的耐心。我在git中签入了我的上一个代码更改:并成为一个新错误:无法解析WetterService的所有参数:(?)非常感谢Hanks Carsten的快速回答,我已经重构了我的代码。而且这个应用程序还能工作!但我不知道如何更改我的服务测试:我已经将更改推到了git中。很高兴听到你的应用程序运行正常,但我不知道你想更改什么。对于服务规范,我通常避免使用测试床。看,是的,我也使用测试床。你可以在我上面的链接中看到。对不起,我是新来的。我需要帮助来初始化我的服务。在这种情况下,我会向提供者添加类似{use:DarkSkyApi,useClass:FakeDarkSkyApi}的内容-然后DI将被解决,它将使用你的假类而不是真类Hey carsten,感谢你的耐心。我在git中签入了我的上一个代码更改:并出现了一个新错误:无法解析WetterService的所有参数:(?)非常感谢