2016-05-23 2 views
2

У меня есть компонент, который я пытаюсь модульного тестирования, но я получаю эти ошибки, в зависимости от своих импортных заявлений:Barrel Import Появляется To Break Load Order

Error: Cannot resolve all parameters for 'MyComponent'(undefined, FormBuilder). 

TypeError: Cannot read property 'toString' of undefined 

Мой компонент принимает 2 параметра, один FormBuilder и один пользовательский сервис, который должен быть введен:

import {MyService} from '../'; 

@Component({ 
    ..., 
    providers: [MyService] 
}) 
class MyComponent { 
    constructor(service: MyService, fb: FormBuilder) { ... } 
    ... 
} 

и мой блок тест установки следующим образом:

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(); 
     }) 
    ); 

} 

Импорт, как представляется, проблема, так как я пытаюсь использовать бочки:

| 
|- my-component 
| |- index.ts 
| |- my.component.ts 
| |- my.component.spec.ts 
| 
|- my-service 
| |- index.ts 
| |- my.service.ts 
| 
|- index.ts 

Внутри моих index.ts файлов, я делаю:

export * from '<filename>'; 
export * from '<directory>'; 

в зависимости от обстоятельств.

Однако, когда я изменяю импорт в модуле unit и компонент, чтобы напрямую ссылаться на служебный файл, работает единичный тест.

import {MyService} from '../my-service/my.service'; 

Я использую угловой кли в этом проекте и SystemJS конфигурируется с сгенерированным файлом конфигурации от того:

... 
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 
}); 
... 

Кажется, что когда я импортировать из бочек, компоненты и определения сервиса не загружаются перед модульным тестовым кодом. Само приложение будет препровождать и запускать в любом случае.

Извините, если это просит широкий вопрос, но я по-прежнему довольно новыми для бочек и SystemJS, и я не знаю, как сузить область далее:

Является ли это ошибка с SystemJS/Jasmine/TypeScript/Angular2 или я что-то не так в настройках?

ответ

3

Мне нужно будет увидеть содержимое стволов, которые вы импортируете, чтобы знать наверняка, но похоже, что вам нужно изменить порядок экспорта в вашем стволе.

Проблема в angular2 репо существует здесь: https://github.com/angular/angular/issues/9334

Если компонент (А) импорт и использует сервис/компонент (B) из ствола, содержащего экспорт как А и В, и A появляется перед B в бочке, импортированное значение B не определено.

Так что в вашем случае, если вы измените корень index.ts на следующее, вы сможете импортировать из своих стволов.

export * from my-service; 
export * from my-component; 
+0

Звучит точно так же, как то, что я вижу, спасибо. Надеюсь, что это будет исправлено в ближайшее время. – awiseman

+0

Я использую проект angular2-seed, и просто трачу 2 часа +, пытаясь понять, почему моя служба не была разрешена как поставщик в моем конструкторе компонентов ....... чертова услуга была объявлена ​​после того, как компонент в barrel index.ts. Это было сложно обнаружить! – Ryan