/ / jaśminowa kpina nie służyła służbie, ale faktyczna usługa zwana - kanciasta, szydercza, karma-jaśmin

nieużywana jaśminowa odmiana jaśminu, ale faktyczna usługa zwana - kanciasta, szydercza, karma-jaśmin

W moich specyfikacjach pracowniczych faktyczna usługa dla pracowników jest odbierana, a nie wyśmiewana. Co może być nie tak? Foll. jest mój blok kodu: -

Komponent pracownika

import { Component, ViewChild, OnInit, Input, ElementRef } from "@angular/core";
import { Http } from "@angular/http";
import { Pipe, PipeTransform } from "@angular/core";

import { SharedHttpService } from "../../shared/services/shared-http.service";
import { EmployeeService } from "../services/employee.service";
import { Broadcaster } from "../../shared/services/broadcaster.service";

declare let $: any;
@Component({
moduleId: module.id,
selector: "employee",
templateUrl: "employee.component.html",
providers: [EmployeeService, SharedHttpService, Broadcaster]
})

export class EmployeeComponent implements OnInit {

constructor(private EmployeeService: EmployeeService,
private broadcaster: Broadcaster) {
}

public getAllData(role) {
this.employeeService.getAllEmployeesApiResponse (role);
}
}

Usługa dla pracowników

import { Injectable, Inject } from "@angular/core";
import { Http, Response, Headers } from "@angular/http";
import { RequestOptions } from "@angular/http";
import "rxjs/add/operator/map";
import { Observable } from "rxjs/Rx";

import { SharedHttpService } from "../../shared/services/shared-http.service";
import { Broadcaster } from "../../shared/services/broadcaster.service";

@Injectable()

export class EmployeeService implements IEmployeeService {
constructor(
private _http: Http,
private sharedHttpService: SharedHttpService,
private broadcaster: Broadcaster) { }

public getAllEmployeesApiResponse = (role): any => {
this.sharedHttpService.getAllEmployees(role)
.subscribe(data =>
this.broadcaster.broadcast("GetAllEmployees", data),
err =>
this.errorHandler.handleError(err)
);
}

MockEmployeeService

import { Broadcaster } from "../../shared/services/broadcaster.service";

export class MockEmployeeService implements IEmployeeService {

constructor(private broadcaster: Broadcaster) { }

public getAllEmployeesApiResponse = (role): any => {
let employeeData = JSON.parse("[{"id": 198149,"fullName": "Sean Abrahamsen"},{"id": 198150,"fullName": "Rahyl James"}]}");
let data = [laborScheduleDay, referenceData];

this.broadcaster.broadcast("GetAllEmployees", employeeData);
}
}

EmployeeComponent-spec

import { Component, DebugElement, Optional, ViewChild, OnInit, Input, ElementRef, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
import { async, ComponentFixture, TestBed, inject } from "@angular/core/testing";
import { By } from "@angular/platform-browser";
import { Http } from "@angular/http";

import { EmployeeService } from "../services/employee.service";
import { MockEmployeeService } from "../mock/mock-employee.service";

describe("EmployeeComponent Specs", function () {
let debugElement: DebugElement;
let component: EmployeeComponent;
let fixture: ComponentFixture<EmployeeComponent>;

let EmployeeService: EmployeeService
let mockEmployeeService: MockEmployeeService

beforeEach(async(() => {
mockEmployeeService = new MockEmployeeService(broadcaster);

TestBed.configureTestingModule({
declarations: [EmployeeComponent],
providers: [
{ provide: EmployeeService, useValue: mockEmployeeService }
]
}).compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(EmployeeComponent);
component = fixture.componentInstance;

EmployeeService = TestBed.get(EmployeeService);

fixture.detectChanges();
});

describe("When getAllEmployees is called", () => {
beforeEach(() => {
EmployeeService.getAllEmployeesApiResponse = jasmine.createSpy("getAllEmployeesApiResponse");
});

it("should call getAllEmployeesApiResponse service", () => {
component.getAllEmployees("Manager");
expect(EmployeeService.getAllEmployeesApiResponse).toHaveBeenCalledWith("Manager");
});
});
});

Odpowiedzi:

4 dla odpowiedzi № 1

Dzieje się tak dlatego, że usługi są zadeklarowane na poziomie komponentu

@Component({
providers: [ ... ]
})

Kiedy deklarujesz próbę w TestBed, jest to konfiguracja na poziomie modułu. Dostawca na poziomie składnika zawsze zastępuje dostawcę na poziomie modułu.

To, co możesz zrobić, jest nadrzędne dla dostawcy na poziomie komponentu

TestBed.configureTestingModule({
declarations: [EmployeeComponent]
})
.overrideComponent(EmployeeComponent, {
set: {
providers: [
{ provide: EmployeeService, useValue: mockEmployeeService }
]
}
})
.compileComponents();

Kolejną rzeczą, którą warto rozważyć, jest projektowanie. Powinieneś zastanowić się, czy usługa rzeczywiście ma być ograniczona do komponentu. Jeśli nie, po prostu zadeklaruj go na poziomie modułu, więc będzie to singleton.