1

我一直在看视频和阅读文章,但到目前为止,它们要么在我的脑海中,要么过于简单化。(在这里寻找一个好的金发姑娘型实用解释。)

我有一个具有可观察属性的角度服务,就像这样,我要测试的属性是message$

@Injectable()
export class MyMessageService {
    private messageSubj = new BehaviorSubject("");
    public message$ = this.messageSubj.pipe(filter(msg => !!msg));
    
    public someFunction(msg: string): void {
        this.messageSubj.next(msg);
    }
}

message$根本不应该发射,直到主题以某种方式获得下一步。

我发现的所有测试(至少对我有意义)都定义了 3 个可观察对象: a source$expected$result$,然后比较最后两个,因此:

it("should be easier to test than this", () => {
    scheduler.run((helpers: RunHelpers) => {
        const source$ = helpers.cold("-a-b|", { a: "", b: "hello" });
        const expected$ = helpers.cold("---b|", { b: "hello" });
        
        const result$ = source$.pipe(filter(x => !!x));
        helpers.expectObservable(result$).toEqual(expected$);
    });
});

现在,如果我想测试我的服务的message$observable,我将如何更改上述测试?我会用 替换source$const source$ = myService.message$?那是对的吗?

如果我这样做,我可以测试它不会发射(WOOHOO!)。但是我怎样才能测试它,以便在“a”处源不发射,但在“b”之前或在“b”处,我调用myService.someFunction("hello")以便在“b”处,值是“hello”?

谢谢!

4

1 回答 1

0

我不确定您找到的测试示例;我会测试message$发出一些这样的欲望值:

  it('should emit a value when calling someFunction function', () => {
    service.someFunction('Hello');

    // success
    service.message$.subscribe((message) => expect(message).toEqual('Hello'))
  })

  it('should not emit any value from messages$', () => {
    // success, although is missing expectations
    service.message$.subscribe((message) => expect(message).toBeUndefined())
  })

message$ 根本不应该发出,直到主题以某种方式获得下一步。

message$如果没有人订阅 observable,则根本不应该发出,即使我调用someFunctionnext 值,如果没有人订阅messages$,那么它不会发出任何东西。

如果我这样做,我可以测试它不会发射(WOOHOO!)。

正确,因为没有人订阅$messages,所以没有发出任何值

于 2022-03-04T02:11:42.950 回答