【问题标题】:Angular 2 Services Unit Testing with DarkSkyApi callAngular 2 服务单元测试与 DarkSkyApi 调用
【发布时间】:2017-11-29 15:32:45
【问题描述】:

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

这就是我的问题。我将使用 karma 测试 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_sky_api_1.default 不是构造函数

希望对你有所帮助。

谢谢, 史蒂芬

【问题讨论】:

  • 我对项目的 git:github.com/kaemmi84/kiwiGridWetter
  • 你确定你正确调用了 DarkSkyApi 构造函数。
  • darkSkyApi = new DarkSkyApi(); 在你的测试中应该做什么?您实际上并未使用该实例,并且它与您在生产代码中创建它的方式不匹配。错误来自哪里?
  • 嘿,抱歉,我没有看到您的答案。是的,错误来自初始化。我已经更改了代码。这是我的modul,这是service,这是test of the service。在测试中,我变成了错误“无法解析 WetterService 的所有参数:(?)”

标签: angular unit-testing typescript karma-jasmine angular2-services


【解决方案1】:

原因是您创建了一个新实例而不是拥有一个 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) {}
    };

这实际上只是一个基本的想法,如何重写代码以更好地测试

【讨论】:

  • 感谢 Carsten 的快速回答,我已经重构了我的代码。该应用程序有效!但我不知道如何更改我的服务测试:github.com/kaemmi84/kiwiGridWetter/blob/master/src/app/service/… 我已经在我的 git 中推送了我的更改。谢谢
  • 很高兴听到您的应用可以正常运行,但我不明白您想要更改的内容。对于服务规范,我通常避免使用 testBed。见angular.io/guide/testing#services
  • 是的,我也使用 testBed。您可以在我上面的链接中看到。对不起,我是新手。我需要帮助来启动我的服务。
  • 在这种情况下,我会向提供者添加类似 {use: DarkSkyApi, useClass: FakeDarkSkyApi } - 然后 DI 将得到解决,它将采用你的假课程而不是真实课程
  • 嘿,carten,感谢您的耐心。我在 git 中签入了我的最后一次代码更改:github.com/kaemmi84/kiwiGridWetter/blob/master/src/app/service/… 并成为一个新错误:无法解析 WetterService 的所有参数:(?)非常感谢
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 2019-05-06
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多