【发布时间】:2018-05-12 12:51:20
【问题描述】:
如何让这个订阅在我的单元测试中触发。
.close.then((resolve: IModelInstance): void => {
resolve.status$.subscribe((status: Status): void => {
this._checkStatus(status);
});
});
this._checkStatus(status) 有一些逻辑检查值以触发组件的输出。
到目前为止,在我的单元测试中,我已经模拟了返回解析回调的承诺,如下所示:
......as Spy).and.returnValue({
close: new Promise((resolve: Function): void => {
closeResolve = resolve;
})
});
传递给 closeResolve 的数据如下:
beforeEach(async(() => {
closeResponseSubject = new Subject<Status>();
closeResponse = {} as Partial<Instance> as Instance;
closeResponse.status$ = closeResponseSubject.asObservable();
closeResponseSubject.next(Status.CREATED);
closeResolve(closeResponse);
}));
在使用这种方法时,在组件中,测试确实进入了“then”,但没有进入订阅。我在这里查看了不同的问题和答案,但到目前为止还没有运气。我只是不明白为什么测试不会进入订阅。我不知道
【问题讨论】:
-
你应该直接对你的
checkStatus进行单元测试。 -
@Antoniossss 在我的模拟测试中订阅失败时怎么可能。由于订阅中的回调方法调用了 checkStatus,并且回调的值被传递给 checkStatus。您将如何直接测试 checkStatus ? P.s checkStatus 是组件类的私有方法
-
保护检查状态以使其可测试。整个想法是编写可以通过简单测试进行测试的可测试代码。
-
@Antoniossss 我明白你的意思,我花了这么多时间对这种方法进行单元测试,受够了,事实上我使用了一种更简单的方法,我应该这样做所以首先。更容易测试
-
因此我什至不需要测试 checkStatus,在这种情况下,我对这个方法的结果感兴趣,那就是组件的发射。我可以轻松地 spyOn() 并在期望中使用间谍
标签: angular unit-testing jasmine observable