Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 单元测试-getting TypeError:您提供了一个无效的对象,其中需要一个流_Angular_Jasmine_Ngrx_Jasmine Marbles - Fatal编程技术网

Angular 单元测试-getting TypeError:您提供了一个无效的对象,其中需要一个流

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

我正在尝试进行一个单元测试,其中效果使用服务从API获取结果,然后触发成功操作或错误操作。我一直收到错误
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);
}