我很难理解茉莉花间谍在构造函数中注入依赖项的服务
我有一个带有构造函数的帐户服务
constructor(private readonly api: ApiService,private readonly authorityService: AuthorityService) {}
在帐户服务中,我有一个使用 authorityService(在构造函数中设置)的方法,在返回值之前检查权限
public async getAccount(): Promise<Account | null> {
if (this.authorityService.hasAuthority(Authority.PERM_ACCOUNT_READ)) {
this.account = await this.api.get<Account>('/admin/rest/account');
return this.account;
}
return null;
}
我想要做的是为 getAccount 方法提供单元测试。我想要确保 authorityService.hasAuthority(Authority.PERM_ACCOUNT_READ) 何时返回 true 或 false
在我的测试中,我在 .spec.ts 文件中设置了以下内容
存根 authService
class authorityServiceStub{
hasAuthority(str: string): boolean {
return false;
}
}
然后在我的描述块中我有以下内容
fdescribe('AccountService', () => {
let service: AccountService;
let httpTestingController:HttpTestingController
let authorityServiceDependency:AuthorityService;
/**
* Sets up the testing module before each test case.
*/
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [],
providers: [provideHttpClient(),
provideHttpClientTesting(),
AccountService,{
provide: AuthorityService,
useClass: authorityServiceStub
}
],
})
service = TestBed.inject(AccountService);
authorityServiceDependency = TestBed.inject(AuthorityService);
httpTestingController = TestBed.inject(HttpTestingController);
}));
在我的第一个测试中,我想确保如果权限为 false,则 getAccount() 中的 Account 对象为 null
it('should return null if not permissions and not forced', async() => {
spyOn(authorityServiceDependency, 'hasAuthority').withArgs(Authority.PERM_ACCOUNT_READ).and.returnValue(false);
const account = await service.getAccount();
expect(account).toBeNull();
expect(authorityServiceDependency.hasAuthority).toHaveBeenCalledWith(Authority.PERM_ACCOUNT_READ);
const req = httpTestingController.match((request) =>
request.url.includes("/admin/rest/account")
);
});
此测试通过
但在另一种情况下,我想测试权限设置的时间并验证帐户不为空,我有以下内容
it('should return the account if the permissions are set', async() => {
const accountData = {firstName: 'Test',lastName:"tester"} as Account;
spyOn(authorityServiceDependency, 'hasAuthority').withArgs(Authority.PERM_ACCOUNT_READ).and.returnValue(true);
spyOn(service, 'getAccount').and.returnValue(Promise.resolve(accountData));
service.getAccount().then((account) => {
expect(account).not.toBeNull();
expect(account?.firstName).toEqual("Test");
expect(account?.lastName).toEqual("tester");
expect(service.getAccount).toHaveBeenCalled();
});
expect(authorityServiceDependency.hasAuthority).toHaveBeenCalledWith(Authority.PERM_ACCOUNT_READ);
const req = httpTestingController.match((request) =>
request.url.includes("/admin/rest/account")
);
});
期望expect(authorityServiceDependency.hasAuthority).toHaveBeenCalledWith(Authority.PERM_ACCOUNT_READ);
失败并显示消息
预期间谍 hasAuthority 已被调用:['PERM_ACCOUNT_READ'] 但从未被调用。在 UserContext。(src/app/core/services/account/account.service.spec.ts:86:53)在 Generator.next()在 asyncGeneratorStep(node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js:3:1)在 _next(node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js:17:1)
我知道我做错了什么,但我无论如何都无法让它按我想要的方式工作。不清楚在我的测试中设置模拟类是否是正确的方法。看起来很笨拙,但我在互联网上的某个地方读到过这种方法,它似乎很有意义,但我有点不适应这里的情况,并希望得到任何见解/指导