La importación de barril parece romper el orden de carga
Tengo un componente que estoy intentando probar, pero sigo recibiendo estos errores, según mis declaraciones de importación:
Error: Cannot resolve all parameters for 'MyComponent'(undefined, FormBuilder).
TypeError: Cannot read property 'toString' of undefined
Mi componente toma 2 parámetros, uno el FormBuilder y otro un servicio personalizado, que debe inyectarse:
import {MyService} from '../';
@Component({
...,
providers: [MyService]
})
class MyComponent {
constructor(service: MyService, fb: FormBuilder) { ... }
...
}
Y mi prueba unitaria se configura de la siguiente manera:
import {MyComponent} from './';
import {MyService} from '../';
describe('Component: MyComponent', () => {
let builder: TestComponentBuilder;
beforeEachProviders(() => [
MyService,
MyComponent
]);
beforeEach(inject([TestComponentBuilder], function (tcb: TestComponentBuilder) {
builder = tcb;
}));
it('should inject the component', inject([MyComponent],
(component: MyComponent) => {
expect(component).toBeTruthy();
})
);
}
Las importaciones parecen ser el problema, ya que estoy tratando de usar barriles:
|
|- my-component
| |- index.ts
| |- my.component.ts
| |- my.component.spec.ts
|
|- my-service
| |- index.ts
| |- my.service.ts
|
|- index.ts
Dentro de mis archivos index.ts, estoy haciendo:
export * from '<filename>';
export * from '<directory>';
según sea apropiado.
Sin embargo, cuando cambio las importaciones en la prueba unitaria Y el componente para hacer referencia al archivo de servicio directamente, la prueba unitaria funciona.
import {MyService} from '../my-service/my.service';
Estoy usando angular-cli en este proyecto y SystemJS se está configurando con el archivo de configuración generado a partir de eso:
...
const barrels: string[] = [
...,
// App specific barrels.
'app',
'app/my-service',
'app/my-component'
/** @cli-barrel */
];
const cliSystemConfigPackages: any = {};
barrels.forEach((barrelName: string) => {
cliSystemConfigPackages[barrelName] = { main: 'index' };
});
/** Type declaration for ambient System. */
declare var System: any;
// Apply the CLI SystemJS configuration.
System.config({
map: {
'@angular': 'vendor/@angular',
'rxjs': 'vendor/rxjs',
'main': 'main.js'
},
packages: cliSystemConfigPackages
});
...
Parece que cuando importo desde los barriles, las definiciones de componentes y servicios no se cargan antes del código de prueba de la unidad. La aplicación en sí se transpilará y ejecutará, de cualquier manera.
Lo siento si esto es una pregunta amplia, pero todavía soy bastante nuevo en barriles y SystemJS y no sé cómo reducir aún más el alcance:
¿Es esto un error con SystemJS / Jasmine / TypeScript / Angular2 o estoy haciendo algo mal en mi configuración?