2016-11-04 29 views
6

Bileşenleri ComponentFactoryResolver kullanarak dinamik olarak oluşturuyorum ve ayrıca bunları ReflectiveInjector kullanarak dinamik olarak aktarıyorum. Ben çekirdek Enjektör modülünü kullanan bileşen için birim testleri yazmaya çalışıyorum buAngular2 2.0.1 bileşen birim testi, çekirdek Enjektör

import {Component, Injector} from '@angular/core'; 
@Component({ 
    selector: 'mycomponent' 
}) 
export class MyComponent { 
    private id: string; 

    constructor(private injector: Injector) { 
     this.id = injector.get('injectedInput'); 
    } 
} 

gibi

Bu

@ViewChild('container', {read: ViewContainerRef}) container: ViewContainerRef; 
let inputProviders = [{ 
    provide: 'injectedInput', 
    useValue: inputValue 
}]; 
let resolvedInputs = ReflectiveInjector.resolve(inputProviders); 
let injector = ReflectiveInjector.fromResolvedProviders(resolvedInputs, this.container.parentInjector); 
let factory = componentInfo.factory.resolveComponentFactory(componentInfo.component); 
let component = factory.create(injector); 
this.container.insert(component.hostView); 

gibi yaklaşık görünüyor Sonra dinamik olarak oluşturulan bileşen görünüyor. Aşağıdaki hatayı alıyorum:

Error: No provider for injectedInput!

Benim özellik dosyası şuna benzer:

import { MyComponent } from 'here'; 
describe('MyComponent',() => { 
    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       MyComponent 
      ] 
     }); 
    }); 

    let component: MyComponent; 

    beforeEach(inject([RigTransferSpeedPeriodComponent], _component => { 
     component = _component; 
    })); 

    {...my tests...} 
}); 

Ben şeyler bir grup çalıştı ve her yerde arandı ama daha önce yapmış kimseyi bulamadık ettik.

Herhangi bir fikrin var mı?

Çok teşekkürler!

Philippe

+0

yok Tüm bunları neden yaptığınızı görmek için ... ama benim için ebeveyni oluşturan bileşen gibi görünüyor. Bu yüzden bileşenin kendisi de parentInjector kullanıyor ve parentInjector enjekte edilmiş bilgiyi bilmiyor. Belki de niyetinizi açıklamalısınız ve belki de tüm enjeksiyon mantığını yeniden sarmaktan başka bir çözüm yolu vardır. –

cevap

0

, plnkr ile biraz tecrübe

@Component({ 
    selector: 'my-component', 
    template: '' 
}) 
export class TestComponent { 
    constructor(
    private injector : Injector 
) { 
    injector.get('value1'); 
    } 
} 

describe('a test',() => { 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     declarations: [ TestComponent ], 
     providers: [ TestComponent ] 
    }); 
    }); 

    beforeEach(() => { 
    this.injector1 = ReflectiveInjector.resolveAndCreate([ 
     {provide: 'value1', useValue: 5} 
    ]); 

    }); 

    it('inject value',() => { 
    expect(this.injector1.get('value1')).toBe(5); 
    }); 

    describe('create component',() => { 
    it('with untouched injector should throw error',() => { 
     expect(() => TestBed.createComponent(TestComponent)).toThrowError(); 
    }) 

    it('with manipulated injector',() => { 
     let componentInjector = TestBed.get(Injector); 
     componentInjector.parent = this.injector1; 
     expect(TestBed.createComponent(TestComponent)).toBeTruthy(); 
    }) 

    it('with injectors in the wrong order',() => { 
     let componentInjector = TestBed.get(Injector); 
     let combinedInjector = ReflectiveInjector.fromResolvedProviders(this.injector1, componentInjector); 
     expect(() => combinedInjector.get(TestComponent)).toThrowError(); 
    }) 
    }); 
}); 

http://plnkr.co/edit/PlUUtTOZq8bPLQ5WdAbE?p=preview

o enjektörleri sırasına hakkında olduğunu kanıtladı ;-) örnek olarak sorununuzu kullanılan