我编写了一个名为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();
}));
});
答案 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对象。 :)
希望这对您有帮助。