通过参数解析时如何期望错误? -茉莉花Angular6

时间:2018-12-05 11:58:48

标签: angular typescript jasmine

我编写了一个名为saveToken(token)的函数,该函数接受一个string参数并将其保存到 angular6 的本地存储中。我正在用茉莉花为其编写测试,并希望当没有给出参数或令牌的格式无效时,测试用例会引发错误。

问题是,当我运行测试用例时,它甚至在运行测试用例之前就停止了,因为没有为函数提供任何参数(或无效参数),因此它永远不会运行。

我想知道是否可以尝试另一种方法(可能称为toRaiseException或类似方法),或者这是否与错误处理有关(坦率地说,没有),所以我可能需要在进行测试之前先添加一些错误处理。

这是我的代码:

jwt.service.ts

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class JwtService {
  /**
   * This method takes the token as an argument and saves it into the local storage.
   *
   * @param  token
   * @method saveToken
   * @return
   */
  saveToken(token: string) {
    window.localStorage['jwtToken'] = token;
  }
}

jwt.service.spec.ts

import { TestBed, inject } from '@angular/core/testing';
import { JwtService } from './jwt.service';

const TOKEN = "SomeToken";

describe('JwtService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        JwtService
      ]
    });
  });


  //saveToken

  it('Call to function is made when there is no access token in arguments', inject([JwtService],
    (service: JwtService) => {
      expect(function() { service.saveToken(null); }).toThrow();
    }));

  it('Call to function is made when the access token is in the wrong format', inject([JwtService],
    (service: JwtService) => {
      let data = {"Token": TOKEN}
      expect(function() { service.saveToken(data); }).toThrow();
    }));


});

1 个答案:

答案 0 :(得分:1)

我将您的测试用例放在Stackblitz中以测试您的断言:“当我运行测试用例时,它停止了,甚至在运行测试用例之前,因为没有参数(或无效参数) )提供给该函数,因此它永远不会运行。”

我认为这很奇怪,而不是我所期望的,所以在设置Stackblitz之后,我将console.log放入saveToken()方法中。如果单击控制台(Stackblitz中Jasmine测试窗口的左下角),即使没有参数传递,也确实会调用该函数。我目前已注释掉那些测试(在测试的前面带有“ x”),但是可以随时删除x并明白我的意思。

在没有参数的情况下调用函数,以及在以错误的类型调用函数时,Typescript确实在抱怨,所以也许这就是您的意思,但是JavaScript本身在这两种情况下都可以使用我猜您想在代码中检查它。

我写了一个新方法,这是一种解决方法,请在Stackblitz中查看saveTokenWithErrorChecking()。此处转载:

saveTokenWithErrorChecking(token: string) {
    if(token === undefined) {
        console.log('saveTokenWithErrorChecking() executed and throwing an error');
        throw new Error('no arguments');
    } else if (typeof token !== 'string') {
        console.log('saveTokenWithErrorChecking() throws a type error');
        throw new Error('token is the wrong type');
    } else {
        console.log('saveTokenWithErrorChecking() executed with no error');
        localStorage.setItem('jwtToken', token);
    }
}  

最后,您会发现我正在使用angular API进行localStorage,而不是直接调用window对象。 :)

希望这对您有帮助。