2016-04-29 140 views
1

我正在使用角2和茉莉来尝试和测试两个服务,一个服务是依赖于另一个。我不断收到服务提供者错误。角2测试 - 服务不会注入

import {Injectable}  from 'angular2/core'; 

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

为serviceA规格

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的提供者! (ServiceB-> ServiceA)

它创建ServiceA所以不知道为什么它说没有提供商。

回答

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 = '/'; 
})); 

你能告诉我一些有关环境你使用?谢谢!

+0

我使用visual studio 2015,angular beta 15,typescript 1.8.9,jasmine 2.4.1,你的测试看起来是正确的,但这不是我得到的。我可以将服务A注入另一服务C但不能将服务B注入服务C –

+0

好吧!谢谢。 PLUNK的版本和我一样吗?你有可能与我分享一些东西来重现(plunkr或github存储库)吗? –

+0

我把我的实际服务放在这里https://plnkr.co/edit/ft7VJ8PMptJbyFdcc4RX?p=preview –