【问题标题】:How to do unit testing of function which is depends on another function using karma jasmine如何使用 karma jasmine 对依赖于另一个函数的函数进行单元测试
【发布时间】:2019-08-16 09:03:56
【问题描述】:

我想测试使用其他方法 jwt_decode 的 getTokenExpirationDate() 方法,它是从 jwt-decode 导入的。我怎样才能对这种方法进行单元测试?如何模拟这个 jwt_decode 方法。

import { Injectable } from '@angular/core';
import {CanActivate, Router} from '@angular/router';
import * as jwt_decode from 'jwt-decode';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {
  constructor(private router: Router) { }

  canActivate(): boolean {
    const token = localStorage.getItem(('loginToken'));
    if (this.isTokenExpired(token)) {
      localStorage.removeItem('loginToken');
      this.router.navigate(['/login']);
      return false;
    } else {
      return true;
    }
  }

  isTokenExpired(token: string): boolean {
    if (!token) { return true;
    } else {
      const date = this.getTokenExpirationDate(token);
      if (date === undefined) {
        return false;
      } else {
        return !(date.valueOf() > new Date().valueOf());
      }
    }
  }

  getTokenExpirationDate(token: string): Date {
    const decoded = jwt_decode(token);
    if (decoded.exp === undefined) {
      return null;
    } else {
      const date = new Date(0);
      date.setUTCSeconds(decoded.exp);
      return date;
    }
  }

}

【问题讨论】:

  • 我不会试图嘲笑它。我只需传递一个有效的 jwt 令牌,该函数可以解码。
  • 另外关于您更新的问题:我宁愿避免在您的方法中调用new Date().valueOf()。因为它的值会根据您的当地时间而改变。 Rahter,在构造函数或方法中注入当前时间作为now 值。然后,您可以创建始终表现相同的测试用例。 (您必须在某些时候将代码粘合到实际注入当前时间的位置,但这应该只是一个启动脚本。在测试中,您可以使用模拟时间。)

标签: angular unit-testing karma-jasmine


【解决方案1】:

你不嘲笑jwt_decode。你只为getTokenExpirationDate编写测试。

jwt_decode 是您的公共函数的内部调用。您可以通过为 getTokenExpirationDate 编写测试用例来隐式测试它。

它似乎是一个没有副作用的纯函数,您可以安全地使用它,并且您的方法的行为将保持一致。

使用它,不要模拟它或为它编写单元测试。测试您的业务逻辑,而不是您的依赖项。


jwt_decode 已经有单元测试:https://github.com/auth0/jwt-decode/blob/master/test/tests.js

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多