我的 Angular 应用程序使用
oidc-client
UserManager 类来管理 OAuth 身份验证。
我有以下服务
export class AuthService {
private userManager: UserManager
private readonly configService: ConfigService;
constructor(configService: ConfigService) {
this.configService = configService;
}
...
async load(): Promise<any> {
config = this.configService.getConfig();
this.userManager = new UserManager(config);
const user = await this.userManager.getUser();
...
我的规格文件设置如下:
beforeEach(() => {
const spy = jasmine.createSpyObj('UserManager', ['getUser']);
spy.getUser.and.returnValue(mockUser);
const configSpy = jasmine.createSpyObj('ConfigService', ['getConfig']);
configSpy.getConfig.and.returnValue(mockConfig);
TestBed.configureTestingModule({
providers: [
AuthenticationService,
{ provide: UserManager, useValue: spy },
{ provide: AppConfigService, useValue: configSpy }
]
});
authService = TestBed.inject(AuthenticationService);
appConfigSpy = TestBed.inject(ConfigService) as jasmine.SpyObj<ConfigService>;
userManagerSpy = TestBed.inject(UserManager) as jasmine.SpyObj<UserManager>;
});
...我的第一个测试用例是:
it('should initialise the user manager', async () => {
// arrange
userManagerSpy.getUser.and.resolveTo(mockUser);
appConfigSpy.getConfig.and.returnValue(mockConfig);
// act
await authService.load();
// assert
expect(userManagerSpy).toHaveBeenCalled();
});
我在运行测试时遇到 404 错误,我猜
new UserManager(config)
和/或 this.userManager.getUser()
在我希望它返回模拟值时试图发出 httpRequest。
如何监视
userManager
并模拟 getUser()
的返回值?
我的理解是 TestBed.configureTestModule 提供者用于设置服务,这些服务被 DI 到服务中,而不是服务本身的成员。
你需要监视一个构造函数。在 JS 世界你可以做这样的事情
spyOn(window, 'UserManager').andReturn(...);
关于监视构造函数的主题:使用 Jasmine 监视构造函数
而不是...您可以创建一个间谍/模拟,然后检查是否调用了#getUser() 函数。或者您可以简单地为#getUser() 创建 Moco 实现。
但是请记住“每次模拟返回一个模拟仙女死”。换句话说 - 这不是编写测试的最佳方式,它表明代码质量存在问题。如果 UserManager 是在函数内部创建的——它不是服务,我认为它不应该有逻辑。
也许您可以重构代码,使配置用于调用在 AuthService 的构造函数中注入的服务方法?