angular - 如何在 Jasmine 中为 localStorage 值编写单元测试用例
问题描述
登录组件.ts
ngOnInit() {
this.createForm();
// loginStatus = 1 - redirect to search
// else - redirect to login
let loginStatus = localStorage.getItem('smtLogin');
if (loginStatus == '1') {
this.router.navigate(['/search']);
} else {
localStorage.setItem('smtLogin', '0');
}
}
login.component.spec.ts
it('it should navigate to search after user signs in', () => {
expect(localStorage.setItem('smtLogin', '1')).toBe('1'); // set the localstorage smtLogin to '1'
expect(localStorage.getItem('smtLogin')).toBe('1'); //get the loaclstotorage smtLogin value as'1'
expect(routerStub.navigate).toHaveBeenCalledWith(['/search']);
});
错误:
'"1"' 类型的参数不能分配给 'Expected' 类型的参数。
在声明之前使用的块范围变量“expect”。
预期的间谍导航已使用 [ [ '/search' ] ] 调用,但从未调用过。
你能帮我为这个语句写一个测试用例this.router.navigate(['/search']); 在 ngOnInit() 的 if() 块内
解决方案
- '"1"' 类型的参数不能分配给 'Expected' 类型的参数:
- 这是因为
expect(localStorage.setItem('smtLogin', '1')).toBe('1');
没有按照你的想法去做。localStorage.setItem()
returnvoid
,不能分配给 typeExpected
-> string。无需期待任何事情,只需做localStorage.setItem('smtLogin', '1')
在声明之前使用的块范围变量“expect”。
- 这看起来像是导入问题,请确保正确导入茉莉花类型。
预期的间谍导航已使用 [ [ '/search' ] ] 调用,但从未调用过。
- 看起来你没有引用实际的路由器,而只是一个存根类。获取对组件中使用的实际路由器的引用,并检查是否调用了该路由器。请阅读https://angular.io/guide/testing#routing-component以获取有关如何执行此操作的说明。
在旁注中,总是===
在比较值时使用:
使用loginStatus === '1'
代替loginStatus == '1'
推荐阅读
- node.js - Zoho 邮件在 Node Js 中显示 535 Authentication Failed
- php - PHP:接收和存储大型二进制数据
- rust - 如何拆分 TokenStream?
- javascript - 使用三元语句显示营业时间的营业时间或关闭时间
- mysql - MySQL UPDATE 与 JOINS 使用 MAX
- docker - 使 systemctl 在 debian 拉伸图像中的容器内部工作
- mysql - 将子查询的 SUM() 结果计算为总数
- python - 如何在熊猫中连续打印大于 80 的值?
- reactjs - 反应中嵌套数组中的setState
- javascript - 类似 Facebook 的 URL