【发布时间】:2017-06-16 18:05:48
【问题描述】:
我一直在尝试模拟一些在我的 Angular 应用程序中返回 observable 的服务调用,但我根本无法在我的代码中创建一个有效的 observable 来触发像 catch() 或 map() 这样的调用。例如:
我的服务:
create(): Observable<any> {
return this.http
.post('/api/stuff', { id: 123 })
.catch(this.handleError)
.map(this.extractData);
}
我的规格:
let authHttpMock = mock(AuthHttp);
when(authHttpMock.post('/api/stuff', { id: 123 })).thenReturn(Observable.create(observer => {
observer.error(new Error('500!'));
}));
const myService = new MyService(instance(authHttpMock));
myService.create({ id: 123 }).subscribe(
result => {
expect(result).toBeTruthy();
}
);
覆盖率分析告诉我handleError 方法从未执行过。在成功的 observable 的情况下,它也不会通过 extractData 方法。
那个 observable 要去哪里?我怎样才能返回一个适当的 observable 来测试这样的调用?
【问题讨论】:
-
是否订阅了 observable?在有订阅之前,observable 不会执行。
-
没有。我应该订阅测试本身吗?
-
我在我的规范中添加了对
create调用的订阅调用,但没有任何改变。 -
我什至在其上添加了一个 expect(result).toBeTruthy() ,但什么也没有。然后我尝试了一个expect(result).toBeUndefined()。什么都没有。
-
Vinny,您能说说您是如何运行测试的以及您使用什么模拟库吗?从语法来看,它看起来像
jasmine-mocks,但我未能在基于浏览器的 Karma 测试中运行它。
标签: angular