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) {}
};
这实际上只是一个基本的想法,如何重写代码以更好地测试
希望对你有所帮助。我在整个互联网上搜索我的问题的答案。我刚开始使用 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) {}
};
这实际上只是一个基本的想法,如何重写代码以更好地测试