我有一个有角度的网络应用程序。我正在尝试测试一些具有其他服务依赖性的服务。 我需要模拟其他服务来测试我的服务。 我正在使用 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
不被识别为吸气剂,我猜是因为它是“函数”(信号)的吸气剂。
那么我可以做什么来模拟这个类呢?我还想确保已访问信号。
要模拟此服务并专注于信号部分,您可以使用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 正确更新。
希望这有帮助!如果您还有其他问题,请随时询问。