所以我想为Angular 2.4.1服务创建一个依赖于Apollo的测试。 在我使用Apollo的服务中,我放置了一个控制台日志,以查看它看到的对象类型,以及函数的结果' watchQuery()'是。我希望日志能够打印出“TEST'”,但我会得到一个未定义的'。
当我只记录' watchQuery'时,它会显示这是一个没有参数的函数。当我更新mock类中的参数时,我将在日志中看到模拟的参数。
所以看起来这个类没有正确启动或者什么。
describe('Service: ViewGraphService', () => {
let viewGraphsService: ViewGraphsService;
let apolloMock: Apollo;
class ApolloMock {
public watchQuery () {
return 'TEST';
}
};
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
ViewGraphsService,
{
provide: Apollo,
useClass: ApolloMock
}
]
});
});
beforeEach(inject([ Apollo ],
(apollo: Apollo) => {
viewGraphsService = new ViewGraphsService(apollo);
apolloMock = apollo;
}));
it('should call apollo when a stream is started', () => {
// do some tests
});
我也尝试使用' useFactory',但它给了我相同的结果..
class ApolloMock {
public watchQuery (a) {
return 'TEST';
}
};
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
ViewGraphsService,
{
provide: Apollo,
useFactory: () => {
return new ApolloMock();
}
}
]
});
});
我在这里缺少什么?
编辑1
从Angular 2 - Unit Testing Observables
尝试了此操作 beforeEach(() => {
apolloMock = new ApolloMock();
TestBed.configureTestingModule({
providers: [
ViewGraphsService,
{ provide: Apollo, useValue: apolloMock }
]
});
viewGraphsService = TestBed.get(ViewGraphsService);
});
编辑2
因此,将ApolloMock类的新实例直接传递给服务是有效的,但这并不像它的工作方式那样......原因很简单,我的打字现在已经关闭了。 ApolloMock类不符合服务所期望的Apollo类/接口。
beforeEach(inject([ Apollo ],
(apollo: Apollo) => {
viewGraphsService = new ViewGraphsService(new ApolloMock());
apolloMock = apollo;
}));
答案 0 :(得分:0)
不确定是否为时已晚。
我使用了窗口实例,并希望在spec文件中模拟该实例。所以,这就是我所做的。
创建一个类,该类返回窗口对象的引用。
export class WindowReference { public getWindowRef() { return this.window; }}
每次需要窗口时,我都将其称为getWindowRef。 在上面的此类课程规范中,我希望windowRef.getWindowRef()等于window。
现在,假设我在某些A类中使用了此getWindowRef()。
请注意,对 windowRefernce
进行了依赖项注入export class A {
console.log(this.windowRefernce.getWindowRef())
}
为此创建规格:
provide: WindowRef, useValue: windowReferenceStub
和windowReferenceStub一样:
let windowReferenceStub= {
getWindowRef: {
methodName: jasmine.createSpy('methodName'),
}
};
在每一个之前:
windowRefStub = TestBed.get(WindowRef);