所以我在单元测试中有一个服务存根,我需要为不同的测试更改返回值。我已经尝试使用间谍捕获并返回所需的值,但这没有用。目前我有一个relavent函数返回一个先前声明的变量,但是,这只会使每个测试超时,就好像永远不会返回一个值。
let schoolIn = false
const calandarServiceStub = {
getSchedule(a) {
return Promise.resolve()
},
// currentClass(a){
// return 'cu'
// },
next(a) {
return 'nextu!'
},
convertTime(a, b) {
return 650
},
isSchoolIn(a, b) {
return schoolIn
},
needsInc(a, b) {
return false
},
endsIn(a) {
return 'endseen'
}
}
错误
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
at http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?916005cc407925f4764668d61d04888d59258f5d:1973:23 [ProxyZone]
at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvokeTask (http://localhost:9876/base/src/test.ts?debf1c3289163cfbc2c419b8e0e217abd44684a5:79544:39) [ProxyZone]
at ZoneDelegate.invokeTask (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:1552:36) [ProxyZone]
at Zone.runTask (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:1320:47) [<root> => ProxyZone]
at ZoneTask.invoke (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:1615:38) [<root>]
at timer (http://localhost:9876/base/src/polyfills.ts?165d95334de0fc3588419d6d62f0ed66f90a6ad5:2695:29) [<root>]
当我这样写时:
isSchoolIn(a, b) {
return true
},
一切正常,除非我需要该值为假。
答案 0 :(得分:0)
试试这个:(calandarServiceStub.getSchedule as Spy).and.returnValue(Observable.of(true))
Observable.of
马上回来!
这可以在每个必需的测试中完成,如果适用于所有测试,则可以在beforeEach中完成
我意识到我的答案不够充分。 所以我会尽力做得更好:
我会嘲笑提供商的电话。这样我就不必创建存根,og使用spy.and.callFake
describe('Service', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{
provide: calandarService,
useValue: {
getSchedule: _ => Observable.of(false),
},
},
],
});
});
beforeEach(()=>{
...
});
});
如果你想监视al元素,你仍然可以这样做:const spy =
spyon(serivce,'getSchedule');`
然后:expect(spy).toHaveBeenCalledTimes(1);