【问题标题】:Angular 2 testing - service won't injectAngular 2 测试 - 服务不会注入
【发布时间】:2016-04-29 20:16:42
【问题描述】:

我正在使用 Angular 2 和 jasmine 来尝试测试几个服务,一个服务依赖于另一个。我不断收到服务提供商错误。

import {Injectable}     from 'angular2/core';

@Injectable()
export class ServiceA {
  constructor() {
  }
}

服务A规范

import {it, 
  describe, expect, 
  beforeEach, 
  beforeEachProviders, inject}
from 'angular2/testing';
import {ServiceA} from './serviceA;

describe('ServiceA Tests', () => {
  let service: ServiceA;

  beforeEachProviders(() => {
    return [
        ServiceA
    ]
  });
  beforeEach(inject([ServiceA], (l) => {
    service = l;
  }));

  it('Service Created', () => {
    expect(service).toBeDefined();
  });

});

配置类

import {OpaqueToken} from 'angular2/core';

export let APP_CONFIG = new OpaqueToken('app.config');

export interface Config {
  applicationBaseUrl: string;    
}

export const CONFIG: Config = {
  applicationBaseUrl: 'some value',
};

服务 b

import { Injectable,Inject}     from 'angular2/core';
import { Http,Response,RequestOptions,Headers} from 'angular2/http';
import {APP_CONFIG, Config,CONFIG}    from './app.config';
import {ServiceA} from './serviceA';

export interface IServiceB {
}

@Injectable()
export class ServiceB implements IServiceB {
  constructor(private _http: Http,@Inject(APP_CONFIG)
       private _config:Config,private serviceA: ServiceA) {

  }

}

服务 B 的规范

import {it, describe, expect, beforeEach, beforeEachProviders,
inject} from 'angular2/testing';
import {ServiceB} from './serviceB';
import {ServiceA} from './serviceA';
import {HTTP_PROVIDERS, Http, Response, RequestOptions,
Headers}   from 'angular2/http';
import {APP_CONFIG, Config, CONFIG}    from './app.config';
import {provide} from 'angular2/core';

import 'rxjs/Rx'; // Add all operators to Observable

describe('ServiceB Tests', () => {
  let serviceB: ServiceB;
  let appConfig: Config;
  let http: Http;
  let serviceA: ServiceA;
  beforeEachProviders(() => {
    return [
        HTTP_PROVIDERS,
        provide(APP_CONFIG, { useValue: CONFIG }),
        ServiceA,
        ServiceB
    ]
  });
  beforeEach(inject([APP_CONFIG, Http, ServiceA,ServiceB], (ac, h, a,b) => {
    appConfig = ac;
    http = h;
    serviceA = a;
    service = b; // new ServiceB(http, appConfig, serviceA);
    appConfig.applicationBaseUrl = '/';

  }));

  it('Http created', () => {
    expect(http).toBeDefined();
  });

  it('service a created', () => {
    expect(serviceA).toBeDefined();
  });

  it('App config created', () => {
    expect(appConfig).toBeDefined();
  });

  it('service B created', () => {
    expect(serviceB).toBeDefined();
  });

});

服务 A 加载并运行良好。如果我手动创建 ServiceB 一切正常,但如果我尝试注入 ServiceB 则会出错。

失败:没有 ServiceA 的提供者! (服务B->服务A)

它创建了 ServiceA,所以不确定为什么它说没有提供者。

【问题讨论】:

    标签: unit-testing angular jasmine


    【解决方案1】:

    我尝试了您的代码,它适用于我使用 beta15 进行依赖注入。看到这个 plunkr:https://plnkr.co/edit/ZgCgNh?p=preview.

    您的 ServiceB 测试代码中有一个小错字:

    beforeEach(inject([APP_CONFIG, Http, ServiceA,ServiceB], (ac, h, a,b) => {
      appConfig = ac;
      http = h;
      serviceA = a;
      serviceB = b; // <-------------
      appConfig.applicationBaseUrl = '/';
    }));
    

    你能告诉我更多关于你使用的环境吗?谢谢!

    【讨论】:

    • 我正在使用 Visual Studio 2015,Angular beta 15,typescript 1.8.9,jasmine 2.4.1,你的测试看起来正确,但这不是我得到的。我可以将服务 A 注入另一个服务 C,但不能将服务 B 注入服务 C
    • 好的!谢谢。 plunkr中的版本和我一样吗?你可以分享我的东西来重现(plunkr 或 github 存储库)吗?
    • 我把我的实际服务放在这里plnkr.co/edit/ft7VJ8PMptJbyFdcc4RX?p=preview
    猜你喜欢
    • 2017-11-19
    • 1970-01-01
    • 2017-08-24
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多