2017-02-15 4 views
0

Я хочу проверить этот компонент с помощью Жасмин:Модульного тестирования Сервисного метода подписного к наблюдаемому в угловом

export class EditorComponent implements OnInit { 
    movimiento: Movimiento; 

    constructor(private route: ActivatedRoute, private datosService: DatosService) { } 

    ngOnInit() { 
    this.route.params 
     .subscribe(params => { 
     const _id = params['id'].toString(); // recepción del parámetro 
     this.datosService 
      .getMovimientoBy_Id$(_id) 
      .subscribe(r => this.movimiento = r); // consulta al servicio 
     }); 
    } 

} 

Этих методы выписывают на Observable<Movement> возвращенной службой. Это DatosServicegetMovimientoBy_Id$(_id) метод:

getMovimientoBy_Id$(_id): Observable<Movimiento> { 
    return this.http 
    .get(`priv/movimientos/${_id}`) 
    .map(r => r.json()); 
} 

Я попробовал этот код, чтобы проверить компонент:

describe('EditorComponent',() => { 
    let movimiento = new Movimiento(new Date(), 0, 1, 1); 
    let component: EditorComponent; 
    let fixture: ComponentFixture<EditorComponent>; 
    let datosService: DatosService; 

    beforeEach(async(() => { 
    let activatedRouteMock = { 
     route: Observable.of({ id: 1 }) 
    } 

    TestBed.configureTestingModule({ 
     imports: [ 
     HttpModule 
     ], 
     declarations: [ 
     EditorComponent 
     ], 
     providers: [ 
     DatosService, 
     { provide: ActivatedRoute, useValue: activatedRouteMock } 
     ] 
    }) 
     .compileComponents(); 
    })); 

    beforeEach(() => { 
    fixture = TestBed.createComponent(EditorComponent); 
    component = fixture.componentInstance; 
    datosService = fixture.debugElement.injector.get(DatosService); 
    }); 

    it('should create',() => { 
    expect(component).toBeTruthy(); 
    }); 

    it('should create movimiento', (done) => { 
    let spy = spyOn(datosService, 'getMovimientoBy_Id$').and.returnValue(Observable.of(movimiento)); 
    fixture.detectChanges(); 
    expect(component.movimiento).toBeTruthy(); 
    }); 
}); 

Первый тест проходит, но во втором я получаю это исключение

Uncaught Error: Error in :0:0 caused by: Cannot read property 'subscribe' of undefined

Я не понимаю, что я делаю неправильно ... Любые идеи о том, что происходит? Благодарю.

ответ

1

Угловые кли перестали добавлять секунды перед каждым.

beforeEach(() => { 
    fixture = TestBed.createComponent(EditorComponent); 
    component = fixture.componentInstance; 
    datosService = fixture.debugElement.injector.get(DatosService); 
    }); 

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

Но вы действительно проблема, как вы макет маршрутизатора. Вам нужно добавить в маршрут собственности Params иначе Params является нулевым

Попробуйте следующее:

describe('EditorComponent',() => { 
    let movimiento = new Movimiento(new Date(), 0, 1, 1); 


beforeEach(async(() => { 
    let activatedRouteMock = { 
     route: { 
     params: { 
      Observable.of({ id: 1 }) 
     } 
     } 
    } 

    TestBed.configureTestingModule({ 
     imports: [ 
     HttpModule 
     ], 
     declarations: [ 
     EditorComponent 
     ], 
     providers: [ 
     DatosService, 
     { provide: ActivatedRoute, useValue: activatedRouteMock } 
     ] 
    }) 
     .compileComponents(); 
    })); 

    it('should create',() => { 
    var component = fixture.componentInstance; 
    expect(component).toBeTruthy(); 
    }); 

    it('should create movimiento', (done) => { 
    var datosService = TestBed.get(DatosService); 
    let spy = spyOn(datosService, 'getMovimientoBy_Id$').and.returnValue(Observable.of(movimiento)); 

    var fixture = TestBed.createComponent(EditorComponent); 
    var component = fixture.componentInstance; 
    fixture.detectChanges(); 
    expect(component.movimiento).toBeTruthy(); 
    }); 
}); 
+0

Привет! Я создал проект с последней версией 'angular-cli', и он создает два метода (асинхронный и синхронизирующий). Во всяком случае, с вашим кодом я получаю то же исключение. –

+0

Наконец-то я решил, что проблема заключается в том, что 'ActivatedRoute' не имеет свойства route, поэтому объявляю его следующим образом:' let activatedRouteMock = { params: Observable.of ({id: 1}) } 'отлично работает , вот почему я получал 'undefined'. –

+0

@EliasGarcia, но это то же самое, что и в вашем вопросе –

Смежные вопросы