gpt4 book ai didi

unit-testing - 使用 Jasmine spy "No provider for Http!"错误的 Angular 2 组件测试

转载 作者:太空狗 更新时间:2023-10-29 17:26:10 25 4
gpt4 key购买 nike

我正在尝试测试使用服务的 Angular 2 组件。该服务已将 Http 注入(inject)其中,我对测试不感兴趣,因此我试图模拟该服务并监视该服务的方法调用。这是我在 Angular 1 中非常熟悉的事情,但我无法在 Angular 2 中工作。我得到的错误是 No provider for Http!我有兴趣监视实际的服务方法而不是模拟它。

我的组件如下所示:

import { Component, OnInit } from '@angular/core';
import { NavBarLink } from '../../models/nav-bar-link';
import { NavBarService } from '../../services/nav-bar/nav-bar.service';

@Component({
selector: 'nav-bar',
providers: [NavBarService],
moduleId: module.id,
templateUrl: 'nav-bar.template.html'
})
export class NavBarComponent {
constructor(private _navBarService: NavBarService) { }

links: NavBarLink[];

getLinks(): void {
this._navBarService.getNavBarLinks().then(data => this.links = data);
}

ngOnInit(): void {
this.getLinks();
}
}

我的服务是这样的:

import { Injectable } from '@angular/core';
import { Headers, Http } from '@angular/http';

import 'rxjs/add/operator/toPromise';

import { Urls } from '../../constants/urls.constants';
import { NavBarLink } from '../../models/nav-bar-link';

@Injectable()
export class NavBarService {
constructor(private _http: Http,
private _urls: Urls) { }

getNavBarLinks():Promise<NavBarLink[]> {

return this._http.get(this._urls.NAV_BAR_LINKS)
.toPromise()
.then(response => {
let navLinks = [];
for(let navLink of response.json()) {
navLinks.push(new NavBarLink(navLink.id, navLink.description, navLink.route));
}
return navLinks;
})
.catch(this.handleError);

}

private handleError(error: any): Promise<any> {
console.error('An error occurred', error); // for demo purposes only
return Promise.reject(error.message || error);
}

}

最后我的测试看起来像这样

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { Provider } from '@angular/core';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';

import { NavBarComponent } from './nav-bar.component';
import { NavBarService } from '../../services/nav-bar/nav-bar.service';

import { Observable } from 'rxjs/Rx';

let comp: NavBarComponent;
let fixture: ComponentFixture<NavBarComponent>;
let navBarService;

class MockNavBarService extends NavBarService{
constructor() {
super(null, null);
}
}

describe ('NavBarComponent tests', () => {

beforeEach( async(() => {
TestBed.configureTestingModule({
declarations: [ NavBarComponent ],
providers: [ {provide: NavBarService, useClass: MockNavBarService} ]
})
.compileComponents()
.then(createComponent);
}));


it('should call the getNavBarLinks when ngOnInit is called', () => {
comp.ngOnInit();
expect(navBarService.getNavBarLinks).toHaveBeenCalled();
});
});

function createComponent() {
fixture = TestBed.createComponent(NavBarComponent);
comp = fixture.componentInstance;

navBarService = fixture.debugElement.injector.get(NavBarService);

spyOn(navBarService, 'getNavBarLinks').and.returnValue(Promise.resolve([]));
}

最佳答案

感谢大家的帮助,这让我找到了正确的区域。缺少的是导入 HttpModule。非常感谢艾哈迈德提出这个建议。这是我的固定测试以供引用:

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { Provider } from '@angular/core';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { HttpModule } from '@angular/http'; // <==== IMPORT THIS

import { MockBackend } from '@angular/http/testing';
import { NavBarComponent } from './nav-bar.component';
import { NavBarService } from '../../services/nav-bar/nav-bar.service';
import { Urls } from '../../constants/urls.constants';

import { Observable } from 'rxjs/Rx';

let comp: NavBarComponent;
let fixture: ComponentFixture<NavBarComponent>;
var navBarService;

describe ('NavBarComponent tests', () => {

beforeEach( async(() => {
TestBed.configureTestingModule({
declarations: [ NavBarComponent ],
imports: [ HttpModule], //<==IMPORT INTO TEST BED
providers: [
Urls,
MockBackend,
NavBarService ]
})
.compileComponents()
.then(createComponent);
}));


it('should call the getNavBarLinks when ngOnInit is called', () => {
comp.ngOnInit();
expect(navBarService.getNavBarLinks).toHaveBeenCalled();
});
});

function createComponent() {
fixture = TestBed.createComponent(NavBarComponent);
comp = fixture.componentInstance;

navBarService = fixture.debugElement.injector.get(NavBarService);

spyOn(navBarService, 'getNavBarLinks').and.returnValue(Promise.resolve([]));
}

不需要模拟对象什么的,完美

关于unit-testing - 使用 Jasmine spy "No provider for Http!"错误的 Angular 2 组件测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40171441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com