2016-07-01 2 views
2

Я пишу несколько тестов для углового применения 2 RC, и у меня возникают некоторые проблемы с тестированием наблюдаемых. Я издевался вверх метод установки его типа как наблюдаемый, но когда устройство тестируется пытается подписаться на издевались наблюдаемым я получаю сообщение об ошибке 'Cannot read property 'subscribe' of undefined'Угловой 2 RC, как проверить блок на наблюдаемый

Я проверяю мой DashboardComponent, который впрыскивает model3DService и вызывает model3DService.get3DModels() который является наблюдаемым который выполняет HTTP-запрос и возвращает массив объектов 3D-модели.

Вот некоторые примеры код:

Dashboard Компонент

import { Model3DService } from '../../services/model3D/model3D.service'; 
import { ProjectService } from '../../services/project/project.service'; 

@Component({ 
    selector: 'cmg-dashboard', 
    styles: [require('./css/dashboard.scss')], 
    template: require('./dashboard.html') 
}) 
export class DashboardComponent implements OnInit { 
    constructor(
    private projectService: ProjectService, 
    private model3DService: Model3DService 
) { } 

    ngOnInit(): void { 
    this.model3DService.get3DModels().subscribe((res: any[]) => { 
     this.findProjects(res); 
     this.models = res; 
     this.projectService.isProjectSelected = true; 
     this.createProject(res[0]); 
    }); 
    } 
} 

Model3DService

@Injectable() 
export class Model3DService { 
private models: any[] = []; 

public get3DModels(): Observable<any> { 
    return this.http.get('../../../json/3DModel.json') 
    .map((res: Response) => { 
     this.models = res.json(); 
     return this.models; 
    }); 
    } 
} 

Хорошо, теперь, что мы имеем при испытании Хереса теста я пишу.

Dashboard Компонент Spec

class MockModel3DService { 
    public get3DModels(): Observable<any> { 
    return; 
    } 
} 

describe('Dashboard Component',() => { 
    beforeEachProviders(() => { 
    return [ 
     DashboardComponent, 
     provide(ProjectService, { 
     useClass: MockProjectService 
     }), 
     provide(Model3DService, { 
     useClass: MockModel3DService 
     }) 
    ]; 
    }); 

    describe('ngOnInit',() => { 
    it('should call model3DService.get3DModels on init', (inject([DashboardComponent], (dashboardComponent: DashboardComponent, model3DService: MockModel3DService) => { 
     dashboardComponent.ngOnInit(); 
     expect(model3DService.get3DModels).toHaveBeenCalled(); 
    }))); 
    }); 
}); 

ответ

3

Концепция аналогична проверке AngularJS $q обещание. Метод stubbed возвращает наблюдаемый макет. Метод может вернуть объект, а не inheritsObservable, но также обладает свойствами как наблюдаемых, так и наблюдателей.

Свежий предмет может быть предоставлен с посмеянной ценностью на месте, требуемое определение должно быть определено заранее (субъекты делят это имущество с отсрочкой, см. the relevant question).

RxJS 4 предмета имеют hasObservers метод, который устраняет subscribe шпион. Объекты RxJS 5 пропускают метод, но они выставляют свойство observers.

Скорее всего, это должно быть что-то вроде этого

let subject: Subject; 

class MockModel3DService { 
    public get3DModels(): Observable<any> { 
    return subject; 
    } 
} 

... 
// beforeEach(...) 
subject = new Subject; 
... 

// it(...) 
const models = ['mocked']; 
dashboardComponent.ngOnInit(); 

expect(subject.observers.length).toBe(1); 

subject.next(models); 
expect(model3DService.get3DModels).toHaveBeenCalled(); 
expect(dashboardComponent.models).toBe(models); 
... 
Смежные вопросы