如何为Jasmine中的localStorage值编写单元测试用例

时间:2020-04-28 08:06:15

标签: angular unit-testing local-storage karma-jasmine

login.component.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. “ 1”类型的参数不能分配给“ Expected”类型的参数。

  2. 在声明之前使用的块范围变量'expect'。

  3. 预期的间谍导航已被[['/ search']]调用,但从未被调用。

您能否帮我为此语句写一个测试用例 this.router.navigate(['/ search']); 在ngOnInit()的if()块内

1 个答案:

答案 0 :(得分:0)

  1. “ 1”类型的参数无法分配给“期望”类型的参数:
  • 这是因为expect(localStorage.setItem('smtLogin', '1')).toBe('1');没有按照您的想法做。 localStorage.setItem()返回void,该值不可分配为类型Expected->字符串。无需期待任何事情,只需localStorage.setItem('smtLogin', '1')

在声明之前使用块范围变量'expect'。

  • 这似乎与导入有关,请确保正确导入了茉莉花类型。

预期的间谍导航已被[['/ search']]调用,但是 从来没有叫过。

  • 看起来您不是在引用实际的路由器,而是仅在存根类中引用。获取组件中使用的实际路由器的参考,并检查是否调用了该路由器。请阅读https://angular.io/guide/testing#routing-component,以获得有关如何执行此操作的说明。

在旁注中,比较值时始终使用===

使用loginStatus === '1'代替loginStatus == '1'