大理石随着时间的推移用茉莉花大理石测试受试者的行为
Marble testing a subject's behavior over time with jasmine-marbles
所以我正在尝试测试对象的行为,但它不起作用,而且似乎有些事情我没有正确理解。考虑以下测试:
it('marble testing subject test', () => {
const obs$: Subject<number> = new Subject<number>();
obs$.next(42);
obs$.next(24);
expect(obs$.asObservable()).toBeObservable(hot('xy', { x: 42, y: 24 }));
});
失败并显示此错误消息:
Expected $.length = 0 to equal 2.
Expected $[0] = undefined to equal Object({ frame: 0, notification: Notification({ kind: 'N', value: 42, error: undefined, hasValue: true }) }).
Expected $[1] = undefined to equal Object({ frame: 10, notification: Notification({ kind: 'N', value: 24, error: undefined, hasValue: true }) }).
我想我有点理解原因:Subject
(根据文档)仅在订阅开始后发出值。 toBeObservable()
函数(我假设)订阅了 Subject
所以我的 2 next
调用发生在这之前,所以它们不会发出。
所以我的问题是,我该如何测试这样的东西?即随着时间的推移测试一个主题的一系列排放?这可能与大理石测试有关吗?我可以通过将其更改为 ReplaySubject
来让它工作,但如果我这样做,弹珠图必须是 (xy)
而不是 xy
。
谢谢。
我在 Angular 应用程序的上下文中工作
我的服务,关键部分是我将我的东西定义为 getter,让我有机会真正监视 asObservable
如果我只是将 things$
定义为 属性 那么间谍就不起作用了:
@Injectable({
providedIn: 'root'
})
export class ApiService {
private things = new BehaviorSubject<Array<string>>([]);
public get things$(): Observable<boolean> {
return this.things.asObservable().pipe(map((things) => things.length > 0))
}
}
然后在我的测试中,我猜关键部分是我正在监视 things
BehaviourSubject
上的 asObservable
方法。像这样:
describe('#things$', () => {
it('should ', () => {
const things. = 'a-b-a';
const expected = 't-f-t';
// spy on
spyOn(service['things'], 'asObservable').and.returnValue(hot(things, {
a: ['a', 'b'],
b: []
}));
expect(service.things$).toBeObservable(cold(expected, {
t: true,
f: false
}));
});
});
所以我正在尝试测试对象的行为,但它不起作用,而且似乎有些事情我没有正确理解。考虑以下测试:
it('marble testing subject test', () => {
const obs$: Subject<number> = new Subject<number>();
obs$.next(42);
obs$.next(24);
expect(obs$.asObservable()).toBeObservable(hot('xy', { x: 42, y: 24 }));
});
失败并显示此错误消息:
Expected $.length = 0 to equal 2.
Expected $[0] = undefined to equal Object({ frame: 0, notification: Notification({ kind: 'N', value: 42, error: undefined, hasValue: true }) }).
Expected $[1] = undefined to equal Object({ frame: 10, notification: Notification({ kind: 'N', value: 24, error: undefined, hasValue: true }) }).
我想我有点理解原因:Subject
(根据文档)仅在订阅开始后发出值。 toBeObservable()
函数(我假设)订阅了 Subject
所以我的 2 next
调用发生在这之前,所以它们不会发出。
所以我的问题是,我该如何测试这样的东西?即随着时间的推移测试一个主题的一系列排放?这可能与大理石测试有关吗?我可以通过将其更改为 ReplaySubject
来让它工作,但如果我这样做,弹珠图必须是 (xy)
而不是 xy
。
谢谢。
我在 Angular 应用程序的上下文中工作
我的服务,关键部分是我将我的东西定义为 getter,让我有机会真正监视 asObservable
如果我只是将 things$
定义为 属性 那么间谍就不起作用了:
@Injectable({
providedIn: 'root'
})
export class ApiService {
private things = new BehaviorSubject<Array<string>>([]);
public get things$(): Observable<boolean> {
return this.things.asObservable().pipe(map((things) => things.length > 0))
}
}
然后在我的测试中,我猜关键部分是我正在监视 things
BehaviourSubject
上的 asObservable
方法。像这样:
describe('#things$', () => {
it('should ', () => {
const things. = 'a-b-a';
const expected = 't-f-t';
// spy on
spyOn(service['things'], 'asObservable').and.returnValue(hot(things, {
a: ['a', 'b'],
b: []
}));
expect(service.things$).toBeObservable(cold(expected, {
t: true,
f: false
}));
});
});