如何使用模拟服务在Angular中对(非组件)支持类进行单元测试
我不太明白如何使用Jasmine对支持类的一些方法进行单元测试。被测试的类是一个单一的纯类型脚本类,它在启动时由其中一个服务初始化,然后通过调用如何使用模拟服务在Angular中对(非组件)支持类进行单元测试,angular,unit-testing,angular-test,Angular,Unit Testing,Angular Test,我不太明白如何使用Jasmine对支持类的一些方法进行单元测试。被测试的类是一个单一的纯类型脚本类,它在启动时由其中一个服务初始化,然后通过调用AccountsManager.getInstance()在应用程序的生命周期中由各种组件使用 下面是该类的构造函数和初始值设定项,称为AccountsManager: export class AccountsManager { private static instance: AccountsManager; static init
AccountsManager.getInstance()
在应用程序的生命周期中由各种组件使用
下面是该类的构造函数和初始值设定项,称为AccountsManager:
export class AccountsManager {
private static instance: AccountsManager;
static initialize(accountService: AccountService) {
if (!this.instance) { this.instance = new AccountsManager(accountService) }
}
static getInstance(): AccountsManager {
if (!this.instance || !this.instance.isInitialized) {
throw new Error("AccountsManager.getInstance(): AccountManager has not been initialized");
}
return this.instance;
}
//methods...
}
我根据各种参考文档中的内容尝试了Jasmine测试,但是我看到的文档展示了如何测试角度组件,而不是任意类
问题是获取AccountService的实例以初始化AccountsManager。实例化真正的AccountService很复杂,所以我想使用模拟服务,因为我想运行的单元测试无论如何都不依赖AccountService
我找到了一个如何使用模拟服务测试组件的示例,但我猜它们是测试POTC的错误设置
不管怎么说,这是我试过的,只是想看看
fdescribe('AccountsManager', () => {
let fixture: ComponentFixture<AccountsManager>
let mockAccountService = { }
let component : AccountsManager;
beforeEach(() =>{
TestBed.configureTestingModule({
declarations: [AccountsManager],
providers: [{provide: AccountService, useValue: mockAccountService}]
})
fixture= TestBed.createComponent(AccountsManager);
component = fixture.componentInstance;
})
});
fdescribe('AccountsManager',()=>{
let夹具:组件夹具
让mockAccountService={}
let组件:AccountsManager;
在每个之前(()=>{
TestBed.configureTestingModule({
声明:[AccountsManager],
提供程序:[{提供:AccountService,useValue:mockAccountService}]
})
fixture=TestBed.createComponent(AccountsManager);
组件=fixture.componentInstance;
})
});
我猜这是行不通的,因为“AccountsManager”只是一个类,它不是一个角度组件,但无论如何,它现在在TestBed.createComponent(AccountsManager)
上失败了,错误消息是AccountsManager的构造函数是私有的(按设计)createComponent希望有一个公共构造函数,但我猜还是有一个更直接的方法来实现我想要的
如果我只想用一个虚拟AccountsService实例初始化这个类,那么最简单的方法是什么,这样我就可以运行我的测试了?如果我得到了你的要求,你需要这样的东西:
description('AccountsManager',()=>{
让mockAccountService={};
let accountsManager:accountsManager;
在每个之前(()=>{
TestBed.configureTestingModule({
提供程序:[{提供:AccountService,useValue:mockAccountService}]
});
AccountsManager.initialize(TestBed.inject(AccountService));
accountsManager=accountsManager.getInstance();
});
它('应该是单身',()=>{
AccountsManager.initialize(TestBed.inject(AccountService));
const am=AccountsManager.getInstance();
预期(am==accountsManager)
.withContext('AccountsManager不是单例')
.toBeTrue();
});
});
如果我得到了你想要的东西,你需要这样的东西:
description('AccountsManager',()=>{
让mockAccountService={};
let accountsManager:accountsManager;
在每个之前(()=>{
TestBed.configureTestingModule({
提供程序:[{提供:AccountService,useValue:mockAccountService}]
});
AccountsManager.initialize(TestBed.inject(AccountService));
accountsManager=accountsManager.getInstance();
});
它('应该是单身',()=>{
AccountsManager.initialize(TestBed.inject(AccountService));
const am=AccountsManager.getInstance();
预期(am==accountsManager)
.withContext('AccountsManager不是单例')
.toBeTrue();
});
});
需要澄清的是:您是否有一个组件和一个同名的普通类,AccountsManager
?如果是这样,您的项目就有问题。如果AccountsManager
不是一个组件,您不应该使用createComponent
来实例化它。测试床的存在基本上是为了实例化它组件并提供注入器+更改检测机制。考虑到AccountsManager
不是角度组件,我将尝试回答您的问题。请澄清:您是否有一个组件和一个普通类具有相同的名称,AccountsManager
?如果是这种情况,则您的项目有问题。如果AccountsManager
不是一个组件,您不应该使用createComponent
对其进行实例化。测试台的存在基本上是为了实例化角度组件,并提供喷油器+变化检测机制。考虑到AccountsManager
不是角度组件,我将尝试回答您的问题。