I have a simple unit test that is done using karma/jasmine on an Angular 6 component. From the pluralsight course and documentation I have gathered it appears I am mocking my service correctly that my component requires, but when the method is called to return data from the mock service I get the error saying property subscribe is undefined.
My "it" function is empty because the test fails once the component is constructed in the beforeEach method. The constructor of the component is what calls the method I am attempting to test. Please see my code below.
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
import { MainComponent } from './main.component';
import { DataService } from '../services/data.service';
import { of } from 'rxjs';
import { NO_ERRORS_SCHEMA } from "@angular/core";
describe('Should construct MainComponent', () => {
let mainComponent: MainComponent;
let EMPLOYEES;
let fixture: ComponentFixture<MainComponent>;
let mockDataService;
beforeEach(() => {
EMPLOYEES = [
{
"PrismEmployeeID": 1,
"FirstName": "install2",
"LastName": "account",
"Initials": "IA ",
"NickName": "",
"SSN": "",
"DateOfBirth": "09/26/2014",
"HireDate": "09/26/2014",
"OfficePhone": "9043943239",
"OfficeFax": "9042246400",
"ClassificationID": 133,
"ClassificationDescription": "Claims Support U.S. Insurance",
"SupervisorID": 32,
"DepartmentID": 2,
"DepartmentDescription": "Information Technology",
"SupervisorName": "Jerry Sutton",
"CountryID": 1,
"CountryName": "United States"
}
];
mockDataService = jasmine.createSpyObj(['GetEmployees']);
TestBed.configureTestingModule({
declarations: [MainComponent],
providers: [{ provide: DataService, useValue: mockDataService }],
schemas: [NO_ERRORS_SCHEMA]
});
fixture = TestBed.createComponent(MainComponent);
fixture.detectChanges();
mockDataService = jasmine.createSpyObj(['GetEmployees']);
});
it('should get an array Employees',
() => {});
});
MainComponent
import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';
import { DataService } from '../services/data.service';
import { TableComponent } from './table/table.component';
@Component({
selector: 'main',
templateUrl: './main.component.html',
styleUrls: ['./main.component.css']
})
export class MainComponent {
columns: string[] = ['PrismEmployeeID', 'LastName', 'FirstName', 'Initials', 'LastFour', 'BirthDate', 'HireDate', 'OfficePhone', 'OfficeFax', 'ClassificationDescription', 'SupervisorName', 'DepartmentDescription', 'CountryName'];
loading: boolean = false;
@Input() tableData: Employee[];
constructor(private _dataService: DataService) {
this.loadEmployees();
}
loadEmployees() {
this.loading = true;
this._dataService.GetEmployees().subscribe((data) => {
this.loading = false;
this.tableData = data.json() as Employee[];
});
}
onLoading(loading: boolean) {
this.loading = loading;
}
onReloadData(reloadData: boolean) {
this.loadEmployees();
}
}
interface Employee {
PrismEmployeeID: number;
FirstName: string;
LastName: string;
Initials: string;
NickName: string;
SSN: string;
DateOfBirth: string;
HireDate: string;
OfficePhone: string;
OfficeFax: string;
ClassificationID: number;
ClassificationDescription: string;
SupervisorID: number;
DepartmentID: number;
DepartmentDescription: string;
SupervisorName: string;
CountryID: number;
CountryName: string;
_selected: boolean;
}
<br/>
<h2>Prism Employees</h2>
<div *ngIf="loading" class="d-flex justify-content-center bd-highlight mb-3">
<div class="p-2 bd-highlight"></div>
<div class="p-2 bd-highlight">
<mat-spinner id="overlay"></mat-spinner>
</div>
<div class="p-2 bd-highlight"></div>
</div>
<div *ngIf='tableData'>
<table-component #table (loading)="onLoading($event)" (reloadData)="onReloadData($event)" [data]="tableData" [displayedColumns]="columns"></table-component>
</div>
GetEmployees
is invoked. You need to return something – Jota.Toledo