如何用信号模拟 Angular 类?

问题描述 投票:0回答:1

我有一个有角度的网络应用程序。我正在尝试测试一些具有其他服务依赖性的服务。 我需要模拟其他服务来测试我的服务。 我正在使用 Jest+auto-jest-spies 来模拟我的课程,但我愿意接受其他建议。

这是我试图模拟的类的示例(用 signalstory 制作的商店):

import { computed, Injectable } from '@angular/core';
import { ImmutableStore, useDevtools } from 'signalstory';
import { AccountStateModel } from './account-state.model';

@Injectable({ providedIn: 'root' })
export class AccountStore extends ImmutableStore<AccountStateModel> {
  constructor() {
    super({
      plugins: [useDevtools()],
      initialState: {
        isInitialized: false,
        email: null,
        accessToken: null,
        name: null,
        tokenExpiration: null,
        userId: null,
        permissions: null,
      },
    });
  }

  //Queries
  public get isLoggedIn() {
    return computed(() => !!this.state().userId);
  }
  public get userInfo() {
    return this.state;
  }

  // Commands
  //...
}

我想像这样嘲笑它:

describe('PermissionGuard', () => {
  let storeMock!: Spy<AccountStore>;
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        { provide: AccountStore, useValue: createSpyFromClass(AccountStore, { gettersToSpyOn: ['isLoggedIn'] }) },
        PermissionGuard,
      ],
    }).compileComponents();
    storeMock = TestBed.inject<any>(AccountStore);
  });

it('should test the user access', async () => {
  //Arrange
  storeMock.isLoggedIn.mockReturnValue(false);

  //Act
  //...

  //Assert
  //...

  });
});

但是

isLoggedIn
不被识别为吸气剂,我猜是因为它是“函数”(信号)的吸气剂。

那么我可以做什么来模拟这个类呢?我还想确保已访问信号。

angular unit-testing signalstory jest-auto-spies
1个回答
0
投票

要模拟此服务并专注于信号部分,您可以使用spyOn轻松地在set方法上设置间谍:

import { TestBed } from '@angular/core/testing';
import { MyService } from './my-service';
import { signal } from '@angular/core';

describe('MyService', () => {
  let service: MyService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [MyService],
    });
    service = TestBed.inject(MyService);
  });

  it('should mock signal and spy on set', () => {
    const spy = spyOn(service.mySignal, 'set').and.callThrough();

    service.updateSignal(5);

    expect(spy).toHaveBeenCalledWith(5);
    expect(service.mySignal()).toBe(5);
  });
});

在这里,我们监视 Signal 的 set 方法,检查是否使用正确的值调用它,并确保 Signal 正确更新。

希望这有帮助!如果您还有其他问题,请随时询问。

© www.soinside.com 2019 - 2024. All rights reserved.