Angular 单元测试-getting TypeError:您提供了一个无效的对象,其中需要一个流
我正在尝试进行一个单元测试,其中效果使用服务从API获取结果,然后触发成功操作或错误操作。我一直收到错误Angular 单元测试-getting TypeError:您提供了一个无效的对象,其中需要一个流,angular,jasmine,ngrx,jasmine-marbles,Angular,Jasmine,Ngrx,Jasmine Marbles,我正在尝试进行一个单元测试,其中效果使用服务从API获取结果,然后触发成功操作或错误操作。我一直收到错误TypeError:您提供了一个无效的对象,其中需要一个流。您可以提供可观测、承诺、数组或可观测。。不完全确定需要更改什么才能使其正常工作 包括错误检查测试和相关代码 棱角的 Angular CLI: 7.1.4 Node: 10.5.0 OS: win32 x64 Angular: 7.1.4 ... animations, cli, common, compiler, compiler-c
TypeError:您提供了一个无效的对象,其中需要一个流。您可以提供可观测、承诺、数组或可观测。
。不完全确定需要更改什么才能使其正常工作
包括错误检查测试和相关代码
棱角的
Angular CLI: 7.1.4
Node: 10.5.0
OS: win32 x64
Angular: 7.1.4
... animations, cli, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router
Package Version
-----------------------------------------------------------
@angular-devkit/architect 0.10.7
@angular-devkit/build-angular 0.10.7
@angular-devkit/build-optimizer 0.10.7
@angular-devkit/build-webpack 0.10.7
@angular-devkit/core 7.0.7
@angular-devkit/schematics 7.1.4
@angular/cdk 7.2.0
@angular/material 7.2.0
@ngtools/webpack 7.0.7
@schematics/angular 7.1.4
@schematics/update 0.11.4
rxjs 6.3.3
typescript 3.1.6
webpack 4.19.1
试验
description('resultEffects',()=>{
让商店:jasmine.SpyObj;
让ebs:jasmine.SpyObj;
让snackbar:jasmine.SpyObj;
在每个之前(()=>{
store=jasmine.createSpyObj('store',['pipe']);
ebs=jasmine.createSpyObj('EBSService',['getPollResults','getUserHasVoted','getSettings']);
snackbar=jasmine.createSpyObj('snackbar服务',['notify']);
});
描述('fetchResults',()=>{
它(`should dispatch'fetchPanelResultError`,()=>{
const fetchAction=new FetchPanelResults();
常量错误={statusText:'error'};
const errorAction=new fetchPanelResultError({error:error.statusText});
常量值={
答:行动,
e:错误行动
};
常数源=冷('a',值);
预期常数=冷('--e',值);
const actions=新操作(源);
ebs.getPollResults.and.returnValue(throwError(error));
常量效果=新结果效果(
行动,
商店,
snackbar,
ebs
);
期待(
效果。获取结果$({
debounce:20,
调度程序:getTestScheduler()
})
).可观察(预期);
});
});
});
影响
@Effect()
fetchResults$ = ({ debounce = 500, scheduler = asyncScheduler } = {}) => this.actions$.pipe(
ofType<SetPanelResults>(PanelResultsActionTypes.FETCH_PANEL_RESULTS),
// need alternate method for this
// withLatestFrom(this.featureState$),
// map(([_, state]) => state.twitch.token),
debounceTime(debounce, scheduler),
switchMap((token) =>
this.ebs.getPollResults(token).pipe(
map(res => new SetPanelResults(res.data.results)),
catchError(error => of(new FetchPanelResultsError({ error: error.statusText })))
)
)
)
@Effect()
fetchResults$=({debounce=500,scheduler=asyncScheduler}={})=>this.actions$.pipe(
ofType(PanelResultsActionTypes.FETCH_PANEL_RESULTS),
//需要其他方法进行此操作吗
//withLatestFrom(this.featureState$),
//map(([[uu,state])=>state.twitch.token),
去盎司时间(去盎司,调度程序),
开关映射((令牌)=>
this.ebs.getPollResults(令牌).pipe(
map(res=>newsetpanelresults(res.data.results)),
catchError(error=>of(新的FetchPanelResultError({error:error.statusText})))
)
)
)
服务
getPollResults(token: string): Observable<PollResultsFetchData> {
const options = {
headers: ebsHeaders(token)
};
return this.http.get<PollResultsFetchData>(`${this.ebsURL}/poll/results`, options);
}
getPollResults(标记:字符串):可观察{
常量选项={
标题:ebsHeaders(令牌)
};
返回this.http.get(`${this.ebsURL}/poll/results`,options);
}
更新:添加了反盎司以触发弹珠错误。根据评论,仍然需要使用LatestFrom替代,:
问题是,withLatest
from实际上没有返回任何内容,因为您没有功能状态。这是因为您用jasmine.createSpyObj('store',['pipe'])
模拟了商店
要解决此问题,请使用“真实”ngrx存储或使用ngrx 7中实现的 对我来说,在开发过程中,在几个月(7)的实时重新加载过程中,错误开始定期发生。我只是通过暂停几秒钟重新打开浏览器来修复它
今天,重新打开并没有帮助,我偶尔会发现,重新保存一个源文件(即使没有实际更改它)会有帮助,错误也会消失。重新保存触发器通过webpack在内存中重新编译生成项目,并实时重新加载当我尝试时,也会出现相同的错误。我正在遵循使用的模式。我已经克隆了那个回购协议,并运行了测试,它们都通过了。我认为我们走在了正确的轨道上。我添加了一个去抖动,因为我的错误没有触发,然后从错误中删除WithLatest修复了错误。现在,我只需要找出另一种方法,在不丢失动作和不破坏可观察对象的情况下,将其从状态中移除。是的,将其改为模拟存储而不是间谍现在解决了这个问题。非常感谢你的帮助!在测试中使用of()换行预期的
<代码>预期(effects.fetchResults$()).tobeobbservable(of(预期))代码>
getPollResults(token: string): Observable<PollResultsFetchData> {
const options = {
headers: ebsHeaders(token)
};
return this.http.get<PollResultsFetchData>(`${this.ebsURL}/poll/results`, options);
}