[英]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.