我有以下角度(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
版本才能工作。任何想法出了什么问题?
答案 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)