Cannot read property 'subscribe' of undefined in unit test

20,348 views
Skip to first unread message

Can Altıniğne

unread,
Jul 17, 2017, 6:33:41 AM7/17/17
to Angular and AngularJS discussion
I have a component file as shown below

import { Component, OnInit, Input } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { InstanceService } from '../../theme/services/instance-service';

@Component({
selector: 'instance',
styleUrls: ['./instance.scss'],
templateUrl: './instance.html'
})
export class InstanceComponent implements OnInit {

db_name: String;
data: Object;

constructor(private route: ActivatedRoute, private router: Router, private instanceService: InstanceService ) {

}

ngOnInit() {
this.route.params.subscribe((params: Params) => {
this.db_name = params['id'];
});

this.instanceService.getInstances().subscribe((res) => {
this.data = res.find(x => x.db_name === this.db_name);
});
}
}


Also there is a spec file for unit tests but I can not create component successfully. It gives an error which says 'Cannot read property 'subscribe' of undefined'. How can I solve this ?

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { Ng2SmartTableModule } from 'ng2-smart-table';
import { InstanceComponent } from './instance.component';
import { Router, ActivatedRoute } from '@angular/router';
import { InstanceService } from '../../theme/services/instance-service';
import { HttpModule } from '@angular/http';
import { Observable, Subject } from 'rxjs/Rx';
import { RouterTestingModule } from '@angular/router/testing';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import 'rxjs/Rx';
import { Subscription } from 'rxjs/Subscription';

class InstanceServiceStub {
getInstances() {
return Observable.empty();
}
}

describe('InstanceComponent', () => {
let component: InstanceComponent;
let fixture: ComponentFixture<InstanceComponent>;

beforeEach(async(() => {

TestBed.configureTestingModule({
imports: [HttpModule],
declarations: [InstanceComponent],
providers: [{ provide: ActivatedRoute, useValue: { data: Observable.of({ name: 'pinocho' })}},
{ provide: Router },
{ provide: InstanceService, useClass: InstanceServiceStub }],
})
.compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(InstanceComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

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

Kyle Thomas

unread,
Sep 22, 2017, 9:42:10 AM9/22/17
to Angular and AngularJS discussion
I have a RouterLinkStubDirective, etc. provided by Google

describe('LoginComponent', async() => {
   
let mockAuthenticationService: MockAuthenticationService;
   
let mockActivatedRouter: MockActivatedRoute;
   
let mockRouter: MockRouter;
    let comp: LoginComponent;
   
let fixture: ComponentFixture<LoginComponent>;
   
let mockReturnsService: MockReturnsService;

   
beforeEach(() => {
       
mockAuthenticationService = new MockAuthenticationService();
       
mockActivatedRouter = new MockActivatedRoute({ref: 'framedream'});
       
mockRouter = new MockRouter();
       
mockReturnsService = new MockReturnsService();

       
TestBed.configureTestingModule({
           
declarations: [LoginComponent,
               
RouterLinkStubDirective, RouterLinkActiveStubDirective, RouterOutletStubComponent],
           
imports: [
               
FormsModule,
               
MdButtonModule, MdCardModule, MdIconModule,
               
FlexLayoutModule,
               
CovalentLayoutModule, CovalentLoadingModule,
               
HttpModule, BrowserAnimationsModule],
           
providers: [
               
MdIconRegistry,
               
{provide: ReturnsService, useValue: mockReturnsService},
               
{provide: AuthenticationService, useValue: mockAuthenticationService},
               
{provide: ActivatedRoute, useValue: mockActivatedRouter},
               
{provide: Router, useValue: mockRouter},
               
Helper,
               
TdLoadingService,
           
],
           
schemas: [CUSTOM_ELEMENTS_SCHEMA]
       
})
       
// Get rid of app's Router configuration otherwise many failures.
        // Doing so removes Router declarations; add the Router stubs
            .overrideModule(AppModule, {
               
add: {
                   
declarations: [RouterLinkStubDirective, RouterLinkActiveStubDirective, RouterOutletStubComponent]
               
}
           
})
           
.compileComponents();
   
});


Reply all
Reply to author
Forward
0 new messages