【问题标题】:spyOn Jest it is not covering the test even the method it is calledspyOn Jest 它没有覆盖测试,即使它被调用的方法
【发布时间】:2021-11-29 23:00:42
【问题描述】:

我在解决此服务的覆盖范围方面遇到了一些问题。

我完成了设置,它说服务已创建,所以我认为没问题,但后来当我在玩笑中实现或使用 spyOn 时,该方法没有被覆盖。

这是我在服务上的一些代码。 在他的构造函数中声明了 authService。

身份验证服务

 abstract getUserRoles(roles?: boolean): string[];
   
    hasRole(role: string):boolean {
    const roleLow = role && role.toLowerCase();
    return !!roleLow && this.getUserRoles(true).findIndex(r => roleLow === r.totLowerCase()) > =0;
    }

Permissions.service

constructor(protected authService: AuthService) {
}

hasPermission(permission: string) {
return this.authService.hasRole(permission);


hasPermissionAdmin() {
return this.hasPermission('App_Admin_permission');

这就是我的测试代码的样子。

import { TestBed } from "@angular/core/testing"
import { AuthService, PermissionsService } from "services"


describe('Permissions Service', () => {
    let service: PermissionsService;

  const permissionsServiceMock = {
        hasPermission: () => true,
        hasPermissionAdmin: () => true,
      };
  
    beforeEach(() => {
        TestBed.configureTestingModule({
            providers:[
                {provide: PermissionsService, useValue: permissionsServiceMock},
                {provide: AuthService, useValue: MockAuthService},
            ]
        });
        service = TestBed.inject(PermissionsService);
    });
    it('should be created', () => {
        expect(service).toBeTruthy();
      });

      it('should have Admin Permission', () => {
          const spy = jest.spyOn(service, 'hasPermissionAdmin');
          service.hasPermissionAdmin();
          expect(spy).toHaveBeenCalledTimes(1);
      });
}); 

当我开玩笑地运行覆盖时,它正在运行/通过但没有覆盖它。 有人有想法吗?

【问题讨论】:

  • 您为什么得到报道?您似乎正在针对身份验证服务的测试替身“测试”权限服务的测试替身。实际上,您甚至没有使用permissionsServiceMock,因为无论如何您都使用spyOn 方法。您所测试的只是当您调用该方法时,您调用该方法,这是完全没有意义的——您的测试中不涉及真正的实现。
  • @jonrsharpe 你建议在那里测试什么?
  • 测试实际的行为 - 它如何与合作者的测试替身进行交互,返回什么? expect(service.hasPermissionAdmin()).toBe(true),例如,给定适当的身份验证服务配置。
  • @jonrsharpe 非常感谢 :)

标签: angular unit-testing jestjs


【解决方案1】:

试试这个:--

 it('should have Admin Permission', () => {
          const spy = jest.spyOn(service, 'hasPermission').mockReturnValue(true);
          service.hasPermissionAdmin();
          expect(spy).toHaveBeenCalledTimes(1);
      });

你已经模拟了你想要调用的整个函数 hasPermissionAdmin,因为你模拟了它,这就是为什么它不会给你覆盖而是尝试模拟它的内部逻辑而不是完全模拟它。

【讨论】:

  • 让我知道这是否适合你
  • 不,它不工作就是这么说的。 expect(jest.fn()).toHaveBeenCalledTimes(expected) 预期通话次数:1 接听通话次数:0,
  • 您能否从提供者中删除此行 {provide: PermissionsService, useValue: jest.fn()},因为您希望仅测试此服务?
  • 但是服务需要提供吧?因为我在测试权限服务
  • 我发现问题出在哪里,因为权限服务没有添加@Injectable,所以导致了这些错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2021-07-17
  • 2020-05-11
  • 2022-01-23
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多