Angular Test仅适用于模拟服务类,但不适用于值

时间:2017-07-21 09:31:29

标签: angular unit-testing typescript

我有以下角度(4)组件测试。在组件中,有一行this.jobService.subscribeEvent('thisline')

class MockJobService {
  public subscribeEvent(line: string): Observable<any> {
    return Observable.of({ action: 'dwnTime' } })
  }
}

describe('NotificationComponent', () => {
  let component: NotificationComponent;
  let fixture: ComponentFixture<NotificationComponent>;
  let mockJobService = new MockJobService();

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [NotificationComponent],
      providers: [
        { provide: JobService, useValue: mockJobService }
      ]
    }).compileComponents();
  }));

当我运行此测试时,我收到错误:

  

TypeError:无法读取属性&#39;订阅&#39;未定义的

但是,如果我更改测试以包含此行:{ provide: JobService, useClass: MockJobService }。然后测试工作,但是,我想在subscribeEvent函数上运行一个间谍,我需要useValue版本才能工作。任何想法出了什么问题?

2 个答案:

答案 0 :(得分:0)

这取决于原始服务的实现,发布的代码无法解释为什么会出现错误。

在这种情况下,

useValue和useClass是可以互换的,但new MockJobService()应放在beforeEach内,以使它们相等。使用新鲜物体总是更好。

也可以使用useClass监视服务方法:

spyOn(MockJobService.prototype, 'subscribeEvent').and...

答案 1 :(得分:0)

间谍方法不会调用实际方法:https://jasmine.github.io/2.0/introduction.html

这就是你获得

的原因
  

无法阅读财产&#39;订阅&#39;未定义的

因为你没有返回Observable而观察者没有任何可订阅的内容。

将以下选项添加到spy中,以便可以调用内部方法:

spyOn(component.mockJobService, 'subscribeEvent').and.callThrough()

或者,定义一个要调用的假函数:

spyOn(component.mockJobService, 'subscribeEvent').and.callFake(myFunction)