使用DarkSkyApi调用进行Angular 2服务单元测试
我希望你能帮忙。我在整个互联网上搜索我的问题的答案。我是Angular 2编程新手,我找到的所有答案都是crypticle 这就是我的问题。我将用因果报应测试angular 2中的服务。并在服务中使用DarkskyApi:使用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
//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的所有参数:(?)非常感谢