Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript angular2/jasmine注入模拟服务不呼叫间谍_Javascript_Unit Testing_Angular_Jasmine_Testbed - Fatal编程技术网

Javascript angular2/jasmine注入模拟服务不呼叫间谍

Javascript angular2/jasmine注入模拟服务不呼叫间谍,javascript,unit-testing,angular,jasmine,testbed,Javascript,Unit Testing,Angular,Jasmine,Testbed,试图使用jasmine对angular2应用程序进行单元测试,但当我尝试注入服务时,间谍不会接听注入的电话 测试套件: import { TestBed, inject, tick, fakeAsync, ComponentFixture } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/rout

试图使用jasmine对angular2应用程序进行单元测试,但当我尝试注入服务时,间谍不会接听注入的电话

测试套件:

import { TestBed, inject, tick, fakeAsync, ComponentFixture } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { RouterTestingModule } from '@angular/router/testing';

import { RoomComponent } from './room.component';

import { Room } from './room';
import { RoomService } from './room.service';
import { MockRoomService } from '../mock/mock.room.service';
import { BaseRequestOptions, Http, ConnectionBackend, Response, ResponseOptions } from '@angular/http';
import { MockBackend } from '@angular/http/testing';

...

beforeEach(fakeAsync(() => {
TestBed.configureTestingModule({
  declarations: [
    RoomComponent
  ],
  providers: [
    {
      provide: Http, useFactory: (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) => {
        return new Http(backend, defaultOptions);
      },
      deps: [MockBackend, BaseRequestOptions]
    },
    RoomService,
    {provide: MockBackend, useClass: MockBackend},
    {provide: BaseRequestOptions, useClass: BaseRequestOptions}
  ],
  imports: [
    RouterTestingModule
  ]
})
.overrideComponent(RoomComponent, {
  set: {
    providers: [{provide: RoomService, useClass: MockRoomService}]
  }
})

...

it('should have rooms after getRooms', inject([RoomService], fakeAsync((mockRoomService: MockRoomService) => {
  let spy = spyOn(mockRoomService, 'getRooms').and.callThrough();
  fixture.detectChanges();
  tick();
  expect(spy).toHaveBeenCalled(); //Does not return true
  expect(component.rooms).toBeDefined();
})));
测试间谍自身是否能够正常工作(使用模拟服务和直接调用),组件是否调用模拟服务而不是真实服务,并返回测试数据:

LOG: 'ngInitified'
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 6 of 21 (skipped 3) SUCCESS (0 secs / 1.156 secs)
LOG: 'method reached'
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 6 of 21 (skipped 3) SUCCESS (0 secs / 1.156 secs)
LOG: 'mock service reached'
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 6 of 21 (skipped 3) SUCCESS (0 secs / 1.156 secs)
LOG: [Object{_id: '12', gitrepo: 'repository', channel: 'slack channel'}, Object{_id: '42', gitrepo: 'newrepo', channel: 'dev'}]
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 6 of 21 (skipped 3) SUCCESS (0 secs / 1.156 secs)
PhantomJS 2.1.1 (Windows 7 0.0.0) Component: Room should have rooms after getRooms FAILED
    Expected spy getRooms to have been called.
我试过直接提供服务。尝试将间谍放在RoomService对象而不是模拟对象上。两人都没有回过电话说那个间谍被叫了

模拟服务:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Room } from '../room/room';

@Injectable()
export class MockRoomService {
    testData: Room[] = [{"_id":"12","gitrepo": "repository", "channel": "slack channel"}, {"_id":"42","gitrepo": "newrepo", "channel": "dev"}];

    constructor(http: Http) { }

    getRooms(): Promise<Room[]> {
        console.log("mock service reached");
        return new Promise((resolve, reject) => {
            resolve(this.testData);
        });
    }

...

帮助?

您得到了错误的
RoomService
提供商实例

it('should have rooms after getRooms', inject([RoomService], fakeAsync((mockRoomService: MockRoomService) => {
  let componentMockRoomService = fixture.debugElement.injector.get(RoomService);
  console.log(mockRoomService instanceof RoomService);         // true
  console.log(componentMockRoomService instanceof RoomService);// false
mockRoomService
是根提供程序的实例,而您需要测试与组件对应的类

这是你的测试

let componentMockRoomService = fixture.debugElement.injector.get(RoomService);
let spy = spyOn(componentMockRoomService, 'getRooms').and.callThrough();

it('should have rooms after getRooms', inject([RoomService], fakeAsync((mockRoomService: MockRoomService) => {
  let componentMockRoomService = fixture.debugElement.injector.get(RoomService);
  console.log(mockRoomService instanceof RoomService);         // true
  console.log(componentMockRoomService instanceof RoomService);// false
let componentMockRoomService = fixture.debugElement.injector.get(RoomService);
let spy = spyOn(componentMockRoomService, 'getRooms').and.callThrough();